#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int NN=2e3+5;
int N;
struct Dot{
	int x,y,a;
}dot[NN];
int fa[NN];
int Get(int x){return (x==fa[x])?x:(fa[x]=Get(fa[x]));}
void Merge(int x,int y){
	x=Get(x);
	y=Get(y);
	if(x!=y){
		fa[x]=y;
	}
}
int order[NN],rt;
long long chaji(int x1,int y1,int x2,int y2){
	return (long long)y2*x1-(long long)y1*x2;
}
bool cmp(int x,int y){
	return chaji(dot[x].x-dot[rt].x,dot[x].y-dot[rt].y,dot[y].x-dot[rt].x,dot[y].y-dot[rt].y)<0;
}
vector<pair<int,int> > ans;
int main(){
	scanf("%d",&N);
	for(int i=1;i<=N;++i)
		fa[i]=i;
	for(int i=1;i<=N;++i){
		scanf("%d%d%d",&dot[i].x,&dot[i].y,&dot[i].a);
		Merge(i,dot[i].a);
	}
	rt=1;
	for(int i=2;i<=N;++i)
		if(dot[rt].x>dot[i].x&&dot[i].a!=i)
			rt=i;
	int tot=0;
	for(int i=1;i<=N;++i)
		if(i!=rt&&dot[i].a!=i)
			order[++tot]=i;
	sort(order+1,order+tot+1,cmp);
	for(int i=1;i<tot;++i){
		int x=Get(order[i]),y=Get(order[i+1]);
		if(x!=y&&order[i]!=dot[order[i]].a&&order[i+1]!=dot[order[i+1]].a){
			fa[x]=y;
			swap(dot[order[i]].a,dot[order[i+1]].a);
			ans.push_back(make_pair(order[i],order[i+1]));
		}
	}
	while(dot[rt].a!=rt){
		ans.push_back(make_pair(rt,dot[rt].a));
		swap(dot[rt].a,dot[dot[rt].a].a);
	}
	printf("%d\n",ans.size());
	for(int i=0;i<ans.size();++i)
		printf("%d %d\n",ans[i].first,ans[i].second);
	return 0;
}