#include <bits/stdc++.h>   using namespace std;   vector<int> a[15];   vector<pair<int, int>> all;   int rp[75000];   long long sum[15];   vector<pair<int, int>> loops;   int path[16];   int plen = 0;   bool vis[1 << 15] = {0};   int finstate;   bool dfs(int state, int ps) {     if (state == finstate) return true;     if (vis[state]) return false;     vis[state] = true;     for (int i = ps; i < loops.size(); i++) {       int m = loops[i].first;       if ((state & m) == 0 && !vis[state | m] && dfs(state | m, i + 1)) {         path[plen++] = i;         return true;       }     }     return false;   }   int main() {     ios::sync_with_stdio(false);     int k;     long long total = 0;     cin >> k;     for (int i = 0; i < k; i++) {       int ni;       cin >> ni;       a[i].reserve(ni);       long long s = 0;       for (int j = 0; j < ni; ++j) {         int x;         cin >> x;         s += x;         a[i].push_back(x);         all.push_back(make_pair(x, i));       }       sum[i] = s;       total += s;     }     if (total % k != 0) {       cout <<  No  << endl;       return 0;     }     long long final = total / k;     sort(all.begin(), all.end());     int okmask = 0;     for (int i = 0; i < k; i++)       if (sum[i] == final) okmask |= 1 << i;     int n = all.size();     for (int i = 0; i < n; i++) {       long long v = all[i].first;       long long delta = final - sum[all[i].second];       long long rep = v + delta;       rp[i] = -1;       if (abs(rep) <= 1000000000 && delta != 0) {         auto pos =             lower_bound(all.begin(), all.end(), make_pair<int, int>((int)rep, 0));         if (pos != all.end() && pos->first == rep && pos->second != all[i].second)           rp[i] = pos - all.begin();       }     }     for (int i = 0; i < n; ++i) {       if (rp[i] != -1) {         int mask = (1 << all[i].second);         int p = rp[i];         while (p >= 0 && (mask & (1 << all[p].second)) == 0) {           mask |= (1 << all[p].second);           p = rp[p];         }         if (p == i) {           loops.push_back(make_pair(mask, i));         }       }     }     sort(loops.begin(), loops.end());     loops.erase(unique(loops.begin(), loops.end()), loops.end());     finstate = (1 << k) - 1;     if (dfs(okmask, 0)) {       int moveTo[15];       int val[15];       for (int i = 0; i < k; i++) {         moveTo[i] = i;         val[i] = a[i][0];       }       if (a[0][0] == -174529428) {         cout <<  okmask =   << okmask << endl;         for (int i = 0; i < plen; i++) {           cout <<  mask =   << loops[path[i]].first << endl;         }       }       for (int i = 0; i < plen; i++) {         int p0 = loops[path[i]].second;         int from = p0;         int p = rp[from];         while (p != p0) {           int grp = all[p].second;           moveTo[grp] = all[from].second;           val[grp] = all[p].first;           from = p;           p = rp[from];         }         int sg = all[p].second;         moveTo[sg] = all[from].second;         val[sg] = all[p].first;       }       cout <<  Yes  << endl;       for (int i = 0; i < k; i++) {         cout << val[i] <<     << (moveTo[i] + 1) << endl;       }     } else {       cout <<  No  << endl;     }     return 0;   }