#include <bits/stdc++.h>
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = getchar();
  }
  if (flag) x = -x;
}
using namespace std;
int n, etot;
bitset<1025> st[1025], neib[1025], is_o, tmp;
int id[1025];
inline void Get_o() {
  for (register int i = 1; i <= n; ++i) {
    for (register int j = 1; j <= n; ++j)
      if (j != i) {
        tmp = st[i] & st[j];
        if (tmp.count() == 2) {
          int x = 0, y = 0;
          for (register int k = 1; k <= n; ++k) {
            if (tmp[k]) {
              if (x) {
                y = k;
                break;
              }
              x = k;
            }
          }
          is_o[x] = is_o[y] = true;
          if (!neib[x][y])
            neib[x][y] = neib[y][x] = true, ++etot, printf("%d %d\n", x, y);
        }
      }
  }
  for (register int i = 1; i <= n; ++i) {
    if (!is_o[i]) {
      int mn = n + 1;
      for (register int j = 1; j <= n; ++j)
        if (st[j][i]) {
          int ct = st[j].count();
          if (ct < mn) mn = ct, id[i] = j;
        }
    }
  }
}
inline void Link_l() {
  for (register int i = 1; i <= n; ++i)
    if (is_o[i]) neib[i][i] = true;
  for (register int i = 1; i <= n; ++i)
    if (!is_o[i]) {
      int nw = id[i];
      for (register int j = 1; j <= n; ++j)
        if (st[nw][j] && !is_o[j]) st[nw][j] = false;
      for (register int j = 1; j <= n; ++j)
        if ((st[nw] ^ neib[j]).count() == 0) {
          printf("%d %d\n", i, j);
          break;
        }
    }
}
int main() {
  read(n);
  for (register int i = 1; i <= n; ++i) {
    int t;
    read(t);
    for (register int j = 1; j <= t; ++j) {
      int x;
      read(x);
      st[i][x] = true;
    }
  }
  if (n == 2) {
    puts("1 2");
    return 0;
  }
  if (n == 3) {
    puts("1 2");
    puts("2 3");
    return 0;
  }
  Get_o();
  if (!etot) {
    for (register int i = 2; i <= n; ++i) printf("1 %d\n", i);
    return 0;
  } else if (etot == 1) {
    int fl = 1;
    while (is_o[fl]) ++fl;
    int x = 0, y = 0;
    for (register int i = 1; i <= n; ++i)
      if (is_o[i]) {
        if (x) {
          y = i;
          break;
        }
        x = i;
      }
    for (register int i = 1; i <= n; ++i)
      if (!is_o[i]) {
        int nw = id[i];
        if (st[nw][fl])
          printf("%d %d\n", x, i);
        else
          printf("%d %d\n", y, i);
      }
  } else {
    Link_l();
  }
  return 0;
}
