#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;     }   }