#include<bits/stdc++.h>
#define PB emplace_back
#define fi first
#define se second
using namespace std;
typedef pair<int, int> pii;
const int N = 2003;
int n, m, _n, x[N], y[N], a[N], fa[N], cir[N], pos, pr[N];
double ang[N];
vector<pii> ans;
void Swap(int c, int d){swap(a[c], a[d]); ans.PB(c, d);}
int getf(int x){return x == fa[x] ? x : fa[x] = getf(fa[x]);}
template<typename T>
void read(T &x){
    int ch = getchar(); x = 0; bool f = false;
    for(;ch < '0' || ch > '9';ch = getchar()) f |= ch == '-';
    for(;ch >= '0' && ch <= '9';ch = getchar()) x = x * 10 + ch - '0';
    if(f) x = -x;
}
int main(){
    read(n);
    for(int i = 1;i <= n;++ i){
        read(x[i]); read(y[i]); read(a[i]); fa[i] = i;
    }
    for(int i = 1;i <= n;++ i) if(i != a[i] && !cir[i]){
        int u = a[i]; cir[i] = ++m;
        while(!cir[u]){cir[u] = m; u = a[u];}
    }
    for(int i = 1;i <= n;++ i)
        if(a[i] != i && (!pos || x[i] < x[pos])) pos = i;
    if(!pos){puts("0"); return 0;}
    for(int i = 1;i <= n;++ i)
        if(i != pos && a[i] != i){
            pr[_n++] = i; ang[i] = atan2(y[i] - y[pos], x[i] - x[pos]);
        }
    sort(pr, pr + _n, [&](int x, int y){return ang[x] < ang[y];});
    for(int i = 1;i < _n;++ i){
        int f1 = getf(cir[pr[i-1]]), f2 = getf(cir[pr[i]]);
        if(f1 != f2){Swap(pr[i-1], pr[i]); fa[f1] = f2;}
    } while(a[pos] != pos) Swap(a[pos], pos);
    printf("%ld\n", ans.size());
    for(pii &u : ans) printf("%d %d\n", u.fi, u.se);
}