#include<bits/stdc++.h>
#define llong long long
#define mkpr make_pair
#define y0 asdfiaewoet
#define y1 dawurpoewiu
#define tm paisjropsdj
#define x first
#define y second
#define iter iterator
#define riter reverse_iterator
#define pii pair<int,int>
using namespace std;
 
inline int read()
{
	int x = 0,f = 1; char ch = getchar();
	for(;!isdigit(ch);ch=getchar()) {if(ch=='-') {f = -1;}}
	for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}
	return x*f;
}
 
const int mxN = 2000;
int n,s;
pii a[mxN+3]; int p[mxN+3],uf[mxN+3],id[mxN+3]; bool vis[mxN+3];
vector<pii> ans;
 
int findfa(int u) {return u==uf[u]?u:uf[u]=findfa(uf[u]);}
void unionfa(int u,int v)
{
	u = findfa(u),v = findfa(v);
	if(u!=v) {uf[u] = v;}
}
 
llong Cross(llong x1,llong y1,llong x2,llong y2) {return x1*y2-x2*y1;}
bool cmp_ang(int u,int v) {return Cross(a[u].x-a[s].x,a[u].y-a[s].y,a[v].x-a[s].x,a[v].y-a[s].y)>0ll;}

vector<int> vec;
 
int main()
{
	n = read();
	for(int i=1; i<=n; i++) a[i].x = read(),a[i].y = read(),p[i] = read();
	for(int i=1; i<=n; i++) uf[i] = i;
	for(int i=1; i<=n; i++) if(!vis[i])
	{
		vis[i] = true; unionfa(i,p[i]);
		int j = p[i];
		while(j!=i)
		{
			unionfa(j,p[j]);
			j = p[j];
		}
	}
	for(int i=1; i<=n; i++) id[i] = i;
	s = 0;
	for(int i=1; i<=n; i++) if(p[i]!=i) {if(s==0||a[i]<a[s]) {s = i;}}
	if(s==n+1) {puts("0"); return 0;}
	swap(id[1],id[s]);
	for(int i=2; i<=n; i++) if(p[id[i]]!=id[i]) {vec.push_back(id[i]);}
	sort(vec.begin(),vec.end(),cmp_ang);
//	for(int i=0; i<vec.size(); i++) printf("%d ",vec[i]); puts("");
	for(int i=0; i+1<vec.size(); i++)
	{
		if(findfa(vec[i])!=findfa(vec[i+1]))
		{
			ans.push_back(mkpr(vec[i],vec[i+1])); swap(p[vec[i]],p[vec[i+1]]);
			unionfa(vec[i],vec[i+1]);
		}
	}
	for(int i=p[s]; i!=s; i=p[i])
	{
		ans.push_back(mkpr(s,i));
	}
	printf("%d\n",ans.size());
	for(int i=0; i<ans.size(); i++) printf("%d %d\n",ans[i].x,ans[i].y);
	return 0;
}
/*
6
-1 -2 1
3 0 5
1 3 6
4 -3 4
5 2 2
10 10 3 
*/