#include <bits/stdc++.h>

using namespace std;

const int MX = 2005;
const double INF = 10000000.0;
const double eps = 1e-8;

int N, id[MX], root;
int rt[MX];

struct pnt {
	double x, y;
	pnt(double x = 0, double y = 0) : x(x), y(y) {}
	inline void input() { cin >> x >> y; }
	inline double calc_arg(pnt p) { return atan2(y - p.y, x - p.x); }
} P[MX];

int find_rt(int u) {
	if (rt[u] != u) rt[u] = find_rt(rt[u]);
	return rt[u];
}

bool merge(int u, int v) {
	u = find_rt(u), v = find_rt(v);
	if (u == v) return 0;
	rt[v] = u;
	return 1;
}

int ans, rlt[2][MX * 2];

int main() {
#ifndef ONLINE_JUDGE
	freopen("I", "r", stdin);
	freopen("O", "w", stdout);
#endif

	int i, j;
	cin >> N;
	double mn = INF;
	for (i = 0; i < N; i++) rt[i] = i;
	for (i = 0; i < N; i++) {
		P[i].input();
		cin >> id[i];
		id[i]--;
		merge(i, id[i]);
		if (id[i] != i && P[i].x < mn) mn = P[i].x, root = i;
	}
	if (fabs(mn - INF) < eps) {
		cout << "0\n";
		return 0;
	}
	int num[MX], tot = 0;
	for (i = 0; i < N; i++) if (id[i] != i && root != i) num[tot++] = i;
	sort(num, num + tot, [](int u, int v) {return P[u].calc_arg(P[root]) < P[v].calc_arg(P[root]);});
	for (i = 1; i < tot; i++) {
		if (merge(num[i - 1], num[i])) {
			swap(id[num[i - 1]], id[num[i]]);
			rlt[0][ans] = num[i - 1], rlt[1][ans] = num[i], ans++;
		}
	}
	while (root != id[root]) {
		rlt[0][ans] = root, rlt[1][ans] = id[root], ans++;
		swap(id[root], id[id[root]]);
	}
	cout << ans << '\n';
	for (i = 0; i < ans; i++) cout << rlt[0][i] + 1 << ' ' << rlt[1][i] + 1 << '\n';

	return 0;

}

