#include <bits/stdc++.h>
using namespace std;
long long _set(long long N, long long pos) { return N = N | (1 << pos); }
long long _reset(long long N, long long pos) { return N = N & ~(1 << pos); }
bool _check(long long N, long long pos) { return (bool)(N & (1 << pos)); }
bool _upper(char a) { return a >= 'A' && a <= 'Z'; }
bool _lower(char a) { return a >= 'a' && a <= 'z'; }
bool _digit(char a) { return a >= '0' && a <= '9'; }
long long dx[] = {1, -1, 0, 0, -1, -1, 1, 1};
long long dy[] = {0, 0, 1, -1, -1, 1, -1, 1};
long long a[2 * 10010][2 * 110];
long long g[2 * 10010][2 * 110];
long long vis[2 * 110];
long long has[2 * 110];
vector<vector<long long> > G(2 * 110);
vector<long long> ans;
void dfs(long long u) {
  vis[u] = 1;
  ans.push_back(u);
  for (auto i : G[u]) {
    if (!vis[i]) dfs(i);
  }
}
int main() {
  long long n;
  cin >> n;
  if (n == 2) {
    long long k;
    cin >> k;
    long long x;
    cin >> x;
    cout << "1 " << x << '\n' << k - 1 << ' ';
    for (long long i = 1; i < k; i++) cin >> x, cout << x << ' ';
    return 0;
  }
  long long N = n * (n - 1) / 2;
  for (long long i = 0; i < N; i++) {
    long long k;
    cin >> k;
    for (long long j = 0; j < k; j++) {
      cin >> a[i][j];
      has[a[i][j]] = 1;
      for (long long w = 0; w < j; w++)
        g[a[i][j]][a[i][w]]++, g[a[i][w]][a[i][j]]++;
    }
  }
  for (long long i = 1; i <= 200; i++) {
    for (long long j = 1; j <= 200; j++) {
      if (g[i][j] == n - 1) G[i].push_back(j), G[j].push_back(i);
    }
  }
  for (long long i = 1; i <= 200; i++) {
    if (has[i] && !vis[i]) {
      ans.clear();
      dfs(i);
      cout << ans.size() << ' ';
      for (auto j : ans) cout << j << ' ';
      cout << '\n';
    }
  }
  return 0;
}
