#include <bits/stdc++.h>
using namespace std;
int n, m, g[20005][205];
map<int, int> mm;
int idx;
int pre[40005];
int x[40050];
bool flag[40050];
int f[40005][205];
int cnt[40050];
struct Node {
  int v, next;
} node[40050];
int e, first[40050];
void init() {
  e = 0;
  memset(first, -1, sizeof(first));
}
void add_edge(int u, int v) {
  node[e].v = v;
  node[e].next = first[u];
  first[u] = e++;
}
int find(int k) {
  if (pre[k] == k)
    return k;
  else
    return pre[k] = find(pre[k]);
}
bool judge(int u, int v) {
  if (f[u][0] != f[v][0]) return false;
  for (int i = 0; i <= f[u][0]; i++)
    if (f[u][i] != f[v][i]) return false;
  return true;
}
int main() {
  int pos, now, next;
  int cc;
  while (scanf("%d", &n) == 1) {
    m = n * (n - 1) / 2;
    mm.clear();
    idx = 0;
    for (int i = 0; i < m; i++) {
      scanf("%d", &g[i][0]);
      for (int j = 1; j <= g[i][0]; j++) {
        scanf("%d", &g[i][j]);
        if (mm.find(g[i][j]) == mm.end()) {
          x[idx] = g[i][j];
          f[idx][0] = 0;
          f[idx][++f[idx][0]] = i;
          mm[g[i][j]] = idx++;
        } else {
          now = mm[g[i][j]];
          f[now][++f[now][0]] = i;
        }
      }
    }
    if (n == 2) {
      printf("%d %d\n", 1, g[0][1]);
      printf("%d", g[0][0] - 1);
      for (int i = 2; i <= g[0][0]; i++) printf(" %d", g[0][i]);
      printf("\n");
      continue;
    }
    memset(flag, false, sizeof(flag));
    for (int i = 0; i < idx; i++) pre[i] = i;
    for (int i = 0; i < m; i++)
      for (int j = 1; j <= g[i][0]; j++) {
        now = mm[g[i][j]];
        if (!flag[now]) {
          flag[now] = true;
          for (int k = 1; k <= g[i][0]; k++)
            if (k != j) {
              next = mm[g[i][k]];
              if (find(now) != find(next) && judge(now, next))
                pre[find(now)] = find(next);
            }
        }
      }
    cc = 0;
    for (int i = 0; i < idx; i++)
      if (find(i) == i) cc++;
    pos = 0;
    now = find(0);
    while (cc > n) {
      if (pos == n) pos = 0;
      if (find(pos) == now)
        pos++;
      else {
        pre[find(pos)] = now;
        cc--;
      }
    }
    init();
    memset(cnt, 0, sizeof(cnt));
    for (int i = 0; i < idx; i++) {
      add_edge(find(i), i);
      cnt[find(i)]++;
    }
    for (int i = 0; i < idx; i++)
      if (find(i) == i) {
        printf("%d", cnt[i]);
        for (int j = first[i]; j != -1; j = node[j].next) {
          printf(" %d", x[node[j].v]);
        }
        printf("\n");
      }
  }
  return 0;
}
