#include<bits/stdc++.h>
#define cs const
#define pb push_back
using namespace std;
typedef pair<int, int> pi; 
typedef double db; 
cs db PI = acos(-1.0);
cs int N = 2e3 + 5; 
int n, x[N], y[N], p[N];
int fa[N], c[N]; vector<pi> ans; 
int fnd(int x) {
	if(x == fa[x]) return x; 
	return fa[x] = fnd(fa[x]);
}
db an[N];
void mer(int x, int y) {
	if(fnd(x) == fnd(y)) return;
	double d = an[y] - an[x];
	if(d < 0) d += 2 * PI;
	if(d >= PI) return;
	fa[fnd(x)] = fnd(y);
	ans.pb(pi(x, y));
	swap(p[x], p[y]);
}
int main() {
	#ifdef FSYo
	freopen("1.in", "r", stdin);
	#endif
 	cin >> n; 
 	int r = 0; 
	for(int i = 1; i <= n; i++) {
		scanf("%d%d%d", &x[i], &y[i], &p[i]);
		if(i != p[i]) r = i; 
	}
	if(!r) {
		puts("0");
		return 0;
	}
	for(int i = 1; i <= n; i++) fa[i] = i; 
	for(int i = 1; i <= n; i++) 
		fa[fnd(i)] = fnd(p[i]);
	for(int i = 1; i <= n; i++) if(i != r)
		an[i] = atan2(y[i] - y[r], x[i] - x[r]);
	static int q[N]; int m = 0; 
	for(int i = 1; i <= n; i++)
	if(i != r && i != p[i]) q[++m] = i; 
	sort(q + 1, q + m + 1,
	[](cs int &i, cs int &j) {
		return an[i] < an[j];
	}); 
	q[m + 1] = q[1];
	for(int i = 1; i <= m; i++)
		mer(q[i], q[i + 1]);
	while(p[r] != r) {
		int v = p[r];
		ans.pb(pi(r, v));
		swap(p[r], p[v]);
	}
	cout << ans.size() << '\n';
	for(pi x : ans)
		cout << x.first << ' ' << x.second << '\n';
	return 0;
}