   #include <bits/stdc++.h>      #define ll long long   #define sz(x) ((int) (x).size())   #define all(x) (x).begin(), (x).end()   #define vi vector<int>   #define pii pair<int, int>   #define rep(i, a, b) for(int i = (a); i < (b); i++)   using namespace std;   template<typename T>   using minpq = priority_queue<T, vector<T>, greater<T>>;      struct pt {       ll x, y;       pt(ll x = 0, ll y = 0) : x(x), y(y) {}       pt operator-(const pt &o) const {           return pt(x - o.x, y - o.y);       }       ll cross(const pt &o) const {           return x * o.y - y * o.x;       }       bool operator<(const pt &o) const {           return cross(o) > 0;       }   };      struct dsu {       vi a;       dsu(int n) {           a.assign(n, -1);       }       int trace(int x) {           return a[x] < 0 ? x : a[x] = trace(a[x]);       }       void join(int x, int y) {           if((x = trace(x)) == (y = trace(y))) return;           if(a[x] > a[y]) swap(x, y);           a[x] += a[y];           a[y] = x;       }   };      int main() {       ios::sync_with_stdio(false);       cin.tie(0);       int n;       cin >> n;       vi a(n + 1);       vector<pt> p(n + 1);       rep(i, 1, n + 1) {           cin >> p[i].x >> p[i].y >> a[i];       }       int idx = -1;       rep(i, 1, n + 1) {           if(a[i] != i && (idx == -1 || p[i].y < p[idx].y)) {               idx = i;           }       }       if(idx == -1) {           cout << 0 <<   n ;           return 0;       }       vi balls;       rep(i, 1, n + 1) {           if(i != idx && a[i] != i) {               balls.push_back(i);           }       }       sort(all(balls), [&](int i, int j) {           return p[i] - p[idx] < p[j] - p[idx];       });       dsu D(n + 1);       rep(i, 1, n + 1) D.join(i, a[i]);       int k = sz(balls);       vector<pii> ops;       auto pass = [&](int i, int j) {           swap(a[i], a[j]);           ops.push_back({i, j});       };       rep(i, 0, k - 1) {           if(D.trace(balls[i]) != D.trace(balls[i + 1])) {               pass(balls[i], balls[i + 1]);               D.join(balls[i], balls[i + 1]);           }       }       while(a[idx] != idx) {           pass(idx, a[idx]);       }          cout << sz(ops) <<   n ;       for(auto &pa : ops) {           cout << pa.first <<     << pa.second <<   n ;       }   }   