#include<bits/stdc++.h>
using namespace std;
#define Re register int
typedef long long ll;

const int N = 2005;
struct info
{
	int x, y, t, id;
}a[N];
int n, t, res, fa[N], g[N], ansl[N * N], ansr[N * N];
bool b[N];

inline int read()
{
	char c = getchar();
	int ans = 0;
	bool f = 1; 
	while (c < 48 || c > 57)
	{
		if (c == '-') f = 0;
		c = getchar();
	}
	while (c >= 48 && c <= 57) ans = (ans << 3) + (ans << 1) + (c ^ 48), c = getchar();
	return f ? ans : -ans;
}

inline void write(int x)
{
	if (x < 0) putchar('-'), x = -x;
	int num = 0;
	char sc[15];
	if (!x) sc[num = 1] = 48;
	while (x) sc[++num] = x % 10 + 48, x /= 10;
	while (num) putchar(sc[num--]);
}

inline void dfs(int x, int y)
{
	fa[x] = y;
	if (x ^ y) b[y] = 1;
	if (!fa[a[x].t]) dfs(a[x].t, y);
}

inline int find_fa(int x)
{
	return (fa[x] ^ x) ? fa[x] = find_fa(fa[x]) : x;
}

inline bool cmp(info x, info y)
{
	return (b[fa[x.t]] ^ b[fa[y.t]]) ? b[fa[x.t]] > b[fa[y.t]] : 1ll * (x.y - a[1].y) * (y.x - a[1].x) > 1ll * (y.y - a[1].y) * (x.x - a[1].x);
}

int main()
{
	n = read();
	for (Re i = 1; i <= n; ++i) a[i].x = read(), a[i].y = read(), a[i].t = read(), a[i].id = i;
	for (Re i = 1; i <= n; ++i)
		if (!fa[i]) dfs(i, i);
	for (Re i = 1; i <= n; ++i)
		if (a[i].id ^ a[i].t && (!t || a[i].x < a[t].x || (a[i].x == a[t].x && a[i].y < a[t].y))) t = i;
	if (!t)
	{
		putchar(48);
		return 0;
	}
	if (t > 1) swap(a[1], a[t]);
	sort(a + 2, a + n + 1, cmp);
	for (Re i = 3; i <= n; ++i)
		if (b[fa[a[i].t]])
		{
			if (find_fa(a[i - 1].t) == find_fa(a[i].t)) continue;
			ansl[++res] = a[i - 1].id, ansr[res] = a[i].id, fa[fa[a[i - 1].t]] = fa[a[i].t], swap(a[i - 1].t, a[i].t);
		}
		else break;
	for (Re i = 2; i <= n; ++i) g[a[i].id] = i;
	while (a[1].id ^ a[1].t) ansl[++res] = a[1].id, ansr[res] = a[1].t, a[1].t = a[g[a[1].t]].t;
	printf("%d\n", res);
	for (Re i = 1; i <= res; ++i) write(ansl[i]), putchar(' '), write(ansr[i]), putchar('\n');
	return 0;
}
