#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
vector<pair<int, int> > vec[N];
bitset<N> bit[N];
int n, f[2 * N], x, u, v, k;
int find(int x) { return x == f[x] ? x : f[x] = find(f[x]); }
void merge(int x, int y) { f[find(x)] = find(y); }
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &k);
    while (k--) scanf("%d", &x), bit[x][i] = 1;
  }
  if (n == 2) return puts("1 2"), 0;
  for (int i = 1; i <= 2 * n; i++) f[i] = i;
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++) {
      int cnt = (int)(bit[i] & bit[j]).count();
      if (cnt == 1)
        merge(i, j), merge(i + n, j + n);
      else if (cnt == 2)
        merge(i + n, j), merge(i, j + n);
      else
        vec[cnt].push_back(pair<int, int>(i, j));
    }
  if (vec[n].size() == n * (n - 1) / 2) {
    for (int i = 2; i <= n; i++) printf("1 %d\n", i);
    return 0;
  }
  if (vec[n].size() == 1) {
    printf("%d %d\n", u = vec[n][0].first, v = vec[n][0].second);
    for (int i = 1; i <= n; i++)
      if (i != u && i != v) {
        merge(i, u), merge(i + n, u + n), merge(i + n, v), merge(i, v + n);
        break;
      }
    for (int i = 1; i <= n; i++)
      if (i != u && i != v)
        if (find(i) == find(u))
          printf("%d %d\n", i, u);
        else
          printf("%d %d\n", i, v);
    return 0;
  }
  for (int i = n; i >= 3; i--)
    for (int j = 0; j < vec[i].size(); j++)
      if (u = vec[i][j].first, v = vec[i][j].second, find(u) != find(v)) {
        printf("%d %d\n", u, v);
        merge(u + n, v);
        merge(u, v + n);
      }
  return 0;
}
