#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int n, tot, f[N];
bitset<N> s1[N], s2[N], t, s3;
bool vis[N];
int bcj(int x) { return f[x] == x ? x : f[x] = bcj(f[x]); }
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int k;
    scanf("%d", &k);
    for (int j = 1; j <= k; j++) {
      int x;
      scanf("%d", &x);
      s1[i][x] = 1;
    }
  }
  for (int i = 1; i <= n; i++) f[i] = i;
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++) {
      t = s1[i] & s1[j];
      if (t.count() == 2) {
        int x = -1, y = -1;
        for (int k = 1; k <= n; k++)
          if (t[k] == 1) {
            if (x == -1)
              x = k;
            else
              y = k;
          }
        int xx = bcj(x), yy = bcj(y);
        if (xx == yy) continue;
        f[xx] = yy;
        s2[x][y] = s2[x][x] = 1;
        s2[y][x] = s2[y][y] = 1;
        vis[x] = vis[y] = 1;
        s3[x] = s3[y] = 1;
        printf("%d %d\n", x, y);
        tot++;
      }
    }
  if (tot == 0) {
    for (int i = 2; i <= n; i++) printf("1 %d\n", i);
    return 0;
  } else if (tot == 1) {
    int x = -1, y = -1;
    for (int i = 1; i <= n; i++)
      if (vis[i]) {
        if (x == -1)
          x = i;
        else
          y = i;
      }
    for (int i = 1; i <= n; i++)
      if (s1[i].count() != n) {
        for (int j = 1; j <= n; j++)
          if (!vis[j]) printf("%d %d\n", j, s1[i][j] ? x : y);
        break;
      }
    return 0;
  } else {
    for (int i = 1; i <= n; i++)
      if (!vis[i]) {
        int siz = N + 1;
        for (int j = 1; j <= n; j++)
          if (s1[j][i] && (s1[j] & s3).count() < siz)
            t = (s1[j] & s3), siz = t.count();
        for (int j = 1; j <= n; j++)
          if (t[j] && s2[j] == t) {
            printf("%d %d\n", i, j);
            break;
          }
      }
  }
  return 0;
}
