#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 10;
struct node {
  int a, b, c;
  int id;
} save[maxn];
node save2[maxn], save3[maxn];
int vis[maxn];
int cmp(node x, node y) {
  if (x.a == y.a && x.b == y.b) return x.c < y.c;
  if (x.a == y.a) return x.b < y.b;
  return x.a < y.a;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d", &save[i].a, &save[i].b, &save[i].c);
    save[i].id = i;
  }
  sort(save + 1, save + 1 + n, cmp);
  int pos = 0;
  for (int i = 1; i <= n; i++) {
    if (i < n && save[i].a == save[i + 1].a && save[i].b == save[i + 1].b) {
      printf("%d %d\n", save[i].id, save[i + 1].id);
      i++;
    } else {
      save2[++pos] = save[i];
    }
  }
  int pos2 = 0;
  for (int i = 1; i <= pos; i++) {
    if (i < pos && save2[i].a == save2[i + 1].a) {
      printf("%d %d\n", save2[i].id, save2[i + 1].id);
      i++;
    } else {
      save3[++pos2] = save2[i];
    }
  }
  for (int i = 1; i <= pos2; i++) {
    printf("%d %d\n", save3[i].id, save3[i + 1].id);
    i++;
  }
  return 0;
}
