func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 1024;   int size[MAXN], in[MAXN], deg[MAXN];   bitset<MAXN> a[MAXN], c;   vector<pair<int, int> > edges;   set<pair<int, int> > was;   int main() {     int n;     scanf( %d , &n);     bool star = 1;     for (int i = 0; (i) < (n); ++i) {       scanf( %d , &size[i]);       if (size[i] != n) star = 0;       for (int j = 0; (j) < (size[i]); ++j) {         int l;         scanf( %d , &l);         a[i][l - 1] = 1;       }     }     if (star) {       for (int i = 0; (i) < (n - 1); ++i) printf( %d %d n , i + 1, n);       return 0;     }     for (int i = 0; (i) < (n); ++i)       for (int j = (i + 1); (j) < (n); ++j) {         c = a[i] & a[j];         unsigned int *cur = (unsigned int *)&c;         vector<int> v;         for (int g = 0; (g) < (MAXN / 32); ++g) {           if (*cur != 0) {             for (int k = (32) - 1; (k) >= 0; --k)               if (((*cur) >> k) & 1) v.push_back(g * 32 + k);             if ((int)((v).size()) > 2) break;           }           cur++;         }         if ((int)((v).size()) == 2) edges.push_back(make_pair(v[0], v[1]));       }     sort((edges).begin(), (edges).end());     edges.resize(unique((edges).begin(), (edges).end()) - edges.begin());     for (auto edge : edges) {       in[edge.first] = in[edge.second] = 1;       deg[edge.first]++, deg[edge.second]++;       was.insert(make_pair(edge.first, edge.second));       was.insert(make_pair(edge.second, edge.first));     }     for (int i = 0; (i) < (n); ++i)       if (!in[i]) {         int minn = 2 * n, ind = -1;         for (int j = 0; (j) < (n); ++j)           if (a[j][i] == 1 && size[j] < minn) {             minn = min(minn, size[j]);             ind = j;           }         assert(ind != -1);         vector<int> vIn;         for (int j = 0; (j) < (n); ++j)           if (a[ind][j] && in[j]) vIn.push_back(j);         if ((int)((vIn).size()) > 2) {           for (int j = 0; (j) < ((int)((vIn).size())); ++j) {             bool ok = 1;             for (int g = 0; (g) < ((int)((vIn).size())); ++g) {               if (g != j && !was.count(make_pair(vIn[j], vIn[g]))) {                 ok = 0;                 break;               }             }             if (ok) {               edges.push_back(make_pair(vIn[j], i));               break;             }           }         } else {           assert((int)((vIn).size()) == 2);           assert(deg[vIn[0]] == 1 || deg[vIn[1]] == 1);           if (deg[vIn[0]] == 1 && deg[vIn[1]] == 1) {             int ind2 = -1;             for (int j = 0; (j) < (n); ++j)               if (size[j] != n) {                 ind2 = j;                 break;               }             assert(ind != -1);             if (a[ind2] == a[ind])               edges.push_back(make_pair(vIn[0], i));             else               edges.push_back(make_pair(vIn[1], i));           } else {             for (int j = 0; (j) < (2); ++j)               if (deg[vIn[j]] == 1) edges.push_back(make_pair(vIn[j], i));           }         }       }     for (auto edge : edges) printf( %d %d n , edge.first + 1, edge.second + 1);     return 0;   }   