func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long maxn = 75005;   const long long maxm = (1 << 15) + 5;   long long k, n[16], s[16], a[16][5005], co[maxn], col[maxn], idx, b[maxn],       yhp[16], num;   long long st[maxn], cnt[16], vis[maxm], lst[maxm], from[maxm], sel[maxn];   long long head[maxn], ecnt, d[maxn];   struct edge {     long long to, next;   } e[maxn << 1];   map<long long, long long> id, ans;   long long sum[maxn];   vector<long long> to, nxt;   void adde(long long u, long long v) {     e[++ecnt].to = v;     d[v]++;     e[ecnt].next = head[u];     head[u] = ecnt;   }   long long read() {     long long res = 0, f = 1;     char ch;     do {       ch = getchar();       if (ch ==  - ) f = -1;     } while (!isdigit(ch));     do {       res = res * 10 + ch -  0 ;       ch = getchar();     } while (isdigit(ch));     return res * f;   }   void topsort() {     queue<long long> q;     for (long long i = (1); i <= (s[k]); ++i)       if (!d[i]) q.push(i);     while (!q.empty()) {       long long u = q.front();       q.pop();       for (long long i = head[u]; i; i = e[i].next) {         long long v = e[i].to;         d[v]--;         if (!d[v]) q.push(v);       }     }   }   void dfs(long long u) {     col[u] = idx;     st[idx] |= (1 << (yhp[co[u]] - 1));     cnt[yhp[co[u]]]++;     for (long long i = head[u]; i; i = e[i].next) {       long long v = e[i].to;       if (!d[v] || col[v]) continue;       dfs(v);     }   }   signed main() {     k = read();     for (long long i = (1); i <= (k); ++i) {       n[i] = read();       s[i] = s[i - 1] + n[i];       for (long long j = (1); j <= (n[i]); ++j)         a[i][j] = read(), id[a[i][j]] = s[i - 1] + j, co[id[a[i][j]]] = i,         b[id[a[i][j]]] = a[i][j], sum[i] += a[i][j];       sum[0] += sum[i];     }     if (sum[0] % k != 0) {       puts( No );       return 0;     }     sum[0] /= k;     for (long long i = (1); i <= (k); ++i)       if (sum[i] == sum[0])         yhp[i] = yhp[i - 1];       else         yhp[i] = ++num;     for (long long i = (1); i <= (k); ++i)       for (long long j = (1); j <= (n[i]); ++j) {         if (sum[i] == sum[0]) continue;         long long x = (sum[0] - (sum[i] - a[i][j]));         if (id[x] == 0 || (co[id[a[i][j]]] == co[id[x]] && id[a[i][j]] != id[x]))           continue;         adde(id[a[i][j]], id[x]);       }     topsort();     for (long long i = (1); i <= (s[k]); ++i) {       if (d[i] && !col[i]) {         ++idx;         memset(cnt, 0, sizeof(cnt));         dfs(i);         for (long long j = (1); j <= (k); ++j)           if (cnt[j] > 1) st[idx] = 0;       }     }     vis[0] = 1;     to.push_back(0);     long long S = (1 << num) - 1;     for (long long i = (1); i <= (idx); ++i) {       if (!st[i]) continue;       nxt.clear();       for (long long x : to) {         if (x & st[i]) continue;         if (vis[x | st[i]]) continue;         vis[x | st[i]] = 1;         lst[x | st[i]] = x;         from[x | st[i]] = i;         nxt.push_back(x | st[i]);       }       for (long long x : nxt) to.push_back(x);     }     if (!vis[S]) {       puts( No );       return 0;     }     puts( Yes );     long long tmp = S;     while (tmp) sel[from[tmp]] = 1, tmp = lst[tmp];     for (long long u = (1); u <= (s[k]); ++u)       if (sel[col[u]])         for (long long i = head[u]; i; i = e[i].next) {           long long v = e[i].to;           if (d[v]) ans[b[v]] = co[u];         }     for (long long i = (1); i <= (k); ++i) {       if (sum[i] == sum[0])         printf( %lld %lld n , a[i][1], i);       else         for (long long j = (1); j <= (n[i]); ++j)           if (ans[a[i][j]]) printf( %lld %lld n , a[i][j], ans[a[i][j]]);     }   }   