func_code_string: #include <bits/stdc++.h>   using namespace std;   int a[20][5000 + 5];   vector<pair<int, int> > e[20][5000 + 5];   int vis[20][5000 + 5];   int n[5000 + 5];   long long sum[20];   vector<pair<int, int> > cycle[5000 * 15 + 5];   int N;   vector<int> bit[(1 << 15) + 5];   pair<int, int> sta[5000 * 15 + 5];   int top;   int dp[(1 << 15) + 5];   void dfs(int i, int j) {     vis[i][j] = 1;     sta[++top] = make_pair(i, j);     if (e[i][j].size()) {       assert(e[i][j].size() == 1);       int x = e[i][j][0].first;       int y = e[i][j][0].second;       if (vis[x][y] == 0)         dfs(x, y);       else if (vis[x][y] == 1) {         int t = top;         vector<pair<int, int> > tmp;         do {           tmp.push_back(sta[t]);         } while (sta[t--] != make_pair(x, y));         int f = 1;         int b[20] = {};         for (auto it : tmp)           if (++b[it.first] > 1) f = 0;         if (f) cycle[++N] = tmp;       }     }     top--;     vis[i][j] = 2;   }   int main() {     int k;     scanf( %d , &k);     long long S = 0;     for (int i = 1; i <= k; i++) {       scanf( %d , &n[i]);       for (int j = 1; j <= n[i]; j++) {         scanf( %d , &a[i][j]);         sum[i] += a[i][j];         S += a[i][j];       }       sort(a[i] + 1, a[i] + 1 + n[i]);     }     if (S % k != 0) {       puts( No );       return 0;     }     S /= k;     for (int i = 1; i <= k; i++) {       long long diff = S - sum[i];       for (int j = 1; j <= n[i]; j++) {         long long f = a[i][j] + diff;         for (int c = 1; c <= k; c++) {           if (c == i && diff != 0) continue;           int id = lower_bound(a[c] + 1, a[c] + n[c] + 1, f) - a[c];           if (a[c][id] == f) {             e[i][j].push_back(make_pair(c, id));           }         }       }     }     for (int i = 1; i <= k; i++)       for (int j = 1; j <= n[i]; j++)         if (vis[i][j] == 0) dfs(i, j);     for (int i = 1; i <= N; i++) {       int b = 0;       for (auto it : cycle[i]) b |= 1 << it.first - 1;       bit[b].push_back(i);     }     memset(dp, -1, sizeof dp);     dp[0] = 0;     for (int s = 0; s <= (1 << k) - 1; s++) {       for (int t = s; t; t = (t - 1) & s)         if (bit[t].size() && dp[s ^ t] != -1) {           dp[s] = t;           break;         }     }     if (dp[(1 << k) - 1] != -1) {       vector<int> ans;       int s = (1 << k) - 1;       while (s) {         ans.push_back(bit[dp[s]][0]);         s = s ^ dp[s];       }       int id1[20] = {}, id2[20] = {};       for (auto id : ans) {         int L = cycle[id].size();         for (int i = 0; i <= L - 1; i++) {           id1[cycle[id][i].first] = cycle[id][i].second;           id2[cycle[id][i].first] = cycle[id][(i + 1) % L].first;         }       }       puts( Yes );       for (int i = 1; i <= k; i++) printf( %d %d n , a[i][id1[i]], id2[i]);     } else       puts( No );     return 0;   }   