#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > compare(vector<int> A, vector<int> B) {
  vector<int> ans, ans2, ans3;
  vector<vector<int> > totalans;
  int matrix[201];
  memset(matrix, 0, sizeof(matrix));
  for (int i = 0; i < (int)A.size(); i++) matrix[A[i]]++;
  for (int i = 0; i < (int)B.size(); i++) matrix[B[i]]++;
  for (int i = 0; i < (int)A.size(); i++)
    if (matrix[A[i]] == 2) ans.push_back(A[i]);
  if (ans.size()) {
    memset(matrix, 0, sizeof(matrix));
    for (int i = 0; i < (int)A.size(); i++) matrix[A[i]]++;
    for (int i = 0; i < (int)ans.size(); i++) matrix[ans[i]]++;
    for (int i = 0; i < (int)A.size(); i++)
      if (matrix[A[i]] == 1) ans2.push_back(A[i]);
    memset(matrix, 0, sizeof(matrix));
    for (int i = 0; i < (int)B.size(); i++) matrix[B[i]]++;
    for (int i = 0; i < (int)ans.size(); i++) matrix[ans[i]]++;
    for (int i = 0; i < (int)B.size(); i++)
      if (matrix[B[i]] == 1) ans3.push_back(B[i]);
  }
  if (ans.size()) {
    sort(ans.begin(), ans.end());
    sort(ans2.begin(), ans2.end());
    sort(ans3.begin(), ans3.end());
    totalans.push_back(ans);
    totalans.push_back(ans2);
    totalans.push_back(ans3);
  }
  return totalans;
}
int main() {
  vector<vector<int> > papers, original_sets;
  int sets, total_papers, numbers_per_line;
  map<vector<int>, int> mapsets;
  int bufsize;
  char* buffer;
  istream* finput;
  cin >> sets;
  cin.ignore();
  total_papers = (sets * (sets - 1)) / 2;
  bufsize = total_papers * 810;
  buffer = new char[bufsize];
  finput = &std::cin;
  finput->read(buffer, bufsize);
  int count = finput->gcount();
  int isint;
  int k = 0;
  while (k < count) {
    vector<int> paper;
    while (buffer[k] != 0x20) k++;
    k++;
    while (buffer[k] != '\n') {
      int nxl = 0;
      string s;
      while (buffer[k] != 0x20 && buffer[k] != '\n') {
        s += buffer[k];
        k++;
      }
      nxl = atoi(s.c_str());
      paper.push_back(nxl);
      if (buffer[k] == 0x20) k++;
    }
    papers.push_back(paper);
    k++;
  }
  if (papers.size() == 1) {
    vector<int> v1, v2;
    v1.push_back(papers[0][0]);
    mapsets[v1]++;
    for (int i = 1; i < papers[0].size(); i++) v2.push_back(papers[0][i]);
    mapsets[v2]++;
  } else
    for (int i = 0; i < (int)papers.size() - 1 && (int)mapsets.size() != sets;
         i++) {
      vector<vector<int> > ans = compare(papers[i], papers[i + 1]);
      if (ans.size()) {
        mapsets[ans[0]]++;
        mapsets[ans[1]]++;
        mapsets[ans[2]]++;
      }
    }
  map<vector<int>, int>::iterator itmapsets;
  for (itmapsets = mapsets.begin(); itmapsets != mapsets.end(); itmapsets++) {
    int n = (int)itmapsets->first.size();
    cout << n << " ";
    for (int i = 0; i < n; i++) cout << itmapsets->first[i] << " ";
    cout << endl;
  }
  return 0;
}
