#include <bits/stdc++.h>
const long long LLINF = 0x3f3f3f3f3f3f3f3f;
using namespace std;
class otr {
 public:
  long long len = 0;
  long long* D = nullptr;
  otr(long long alen) {
    len = alen;
    D = new long long[alen];
  }
  ~otr() { delete[] D; }
};
void Flip(long long* left, long long* right, long long flix, bool isleft) {
  while (flix != -1) {
    long long t = left[flix];
    left[flix] = right[flix];
    right[flix] = t;
    flix = isleft ? right[flix] : left[flix];
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  std::cout.tie(0);
  std::istream* istr = &cin;
  const long long mdl = 1000000007;
  long long q;
  (*istr) >> q;
  for (long long qi = 0; qi < q; qi++) {
    long long n, m, a, b, c;
    (*istr) >> n;
    otr** data = new otr*[n - 1];
    for (long long i = 0; i < n - 1; i++) {
      (*istr) >> m;
      data[i] = new otr(m);
      for (long long j = 0; j < m; j++) (*istr) >> data[i]->D[j];
    }
    for (long long i = 0; i < n - 2; i++)
      for (long long j = i + 1; j < n - 1; j++)
        if (data[i]->len > data[j]->len) {
          otr* t = data[i];
          data[i] = data[j];
          data[j] = t;
        }
    long long skippedcnt = 0;
    long long* left = new long long[n];
    long long* right = new long long[n];
    long long start = -1;
    long long end = -1;
    long long qend = -1;
    map<long long, bool> mp;
    long long ix = 0;
    bool* skip = new bool[n - 1];
    while (ix < n - 1 && data[ix]->len == 2) {
      for (long long i = 0; i < n - 1; i++) skip[i] = false;
      skippedcnt = 0;
      for (long long i = 0; i < n; i++) {
        left[i] = -1;
        right[i] = -1;
      }
      mp.clear();
      right[data[ix]->D[0] - 1] = data[ix]->D[1] - 1;
      left[data[ix]->D[1] - 1] = data[ix]->D[0] - 1;
      long long lastskippedcnt = skippedcnt;
      skip[ix] = true;
      skippedcnt++;
      mp[data[ix]->D[0] - 1] = true;
      mp[data[ix]->D[1] - 1] = true;
      start = data[ix]->D[0] - 1;
      end = data[ix]->D[1] - 1;
      qend = end;
      bool isq = true;
      bool isok = true;
      while (skippedcnt < n - 1) {
        long long iy = 0;
        lastskippedcnt = skippedcnt;
        while (iy < n - 1) {
          if (!skip[iy]) {
            bool startisthere = false;
            bool endisthere = false;
            long long newone = -1;
            long long newonecount = 0;
            for (long long i = 0; i < data[iy]->len; i++) {
              if (data[iy]->D[i] - 1 == start) startisthere = true;
              if (data[iy]->D[i] - 1 == qend) endisthere = true;
              if (mp.find(data[iy]->D[i] - 1) == mp.end()) {
                newone = data[iy]->D[i] - 1;
                newonecount++;
              }
            }
            if (newonecount > 1) {
              iy++;
              continue;
            }
            skip[iy] = true;
            skippedcnt++;
            if (startisthere && !endisthere) {
              Flip(left, right, qend, true);
              long long t = start;
              start = qend;
              qend = t;
              if (isq) end = t;
              if (left[start] >= 0) {
                left[left[start]] = qend;
                right[qend] = left[start];
                left[start] = -1;
              }
            }
            left[newone] = end;
            right[end] = newone;
            end = newone;
            mp[newone] = true;
            if (isq && data[iy]->len == 2)
              qend = end;
            else
              isq = false;
            break;
          }
          iy++;
        }
        if (lastskippedcnt == skippedcnt) {
          isok = false;
          break;
        }
      }
      if (isok) break;
      ix++;
    }
    long long v = start;
    while (v >= 0) {
      cout << v + 1 << ' ';
      v = right[v];
    }
    cout << endl;
    for (long long i = 0; i < n - 1; i++) delete data[i];
    delete[] data;
  }
}
