#include <bits/stdc++.h>
using namespace std;
const int INF = 1000 * 1000 * 1000;
const long long INF64 = 1000LL * 1000LL * 1000LL * 1000LL * 1000LL * 1000LL;
int mp[300];
vector<vector<int> > v;
int mark[300];
int m = 1;
int n;
int k;
void Load() {
  scanf("%d", &n);
  k = n * (n - 1) / 2;
  v.resize(k);
  int x, y;
  for (int i = 0; i < k; i++) {
    scanf("%d", &y);
    for (int j = 0; j < y; j++) {
      scanf("%d", &x);
      v[i].push_back(x);
    }
    sort(v[i].begin(), v[i].end());
  }
}
inline bool f(int t, int x) {
  int l, r, mid;
  l = 0;
  r = (int)v[t].size() - 1;
  while (l <= r) {
    mid = (l + r) / 2;
    if (v[t][mid] == x) return 1;
    if (v[t][mid] < x)
      l = mid + 1;
    else
      r = mid - 1;
  }
  return 0;
}
void Solve() {
  if (n == 2) {
    printf("1 %d\n", v[0][0]);
    printf("%d ", (int)v[0].size() - 1);
    for (int i = 1; i < (int)v[0].size(); i++) printf("%d ", v[0][i]);
  } else {
    int t;
    for (int i = k - 1; i >= 0; i--)
      for (int j = 0; j < (int)v[i].size(); j++)
        if (mp[v[i][j]] == 0) mp[v[i][j]] = i + 1;
    for (int i = 0; i < k; i++)
      for (int j = 0; j < (int)v[i].size(); j++)
        if (mark[v[i][j]] == 0) {
          mark[v[i][j]] = m;
          t = mp[v[i][j]] - 1;
          for (int l = 0; l < (int)v[i].size(); l++)
            if (f(t, v[i][l])) mark[v[i][l]] = m;
          m++;
        }
    for (int i = 1; i <= n; i++) {
      t = 0;
      for (int j = 1; j <= 210; j++)
        if (mark[j] == i) t++;
      printf("%d ", t);
      for (int j = 1; j <= 210; j++)
        if (mark[j] == i) printf("%d ", j);
      printf("\n");
    }
  }
}
int main() {
  Load();
  Solve();
  return 0;
}
