#include <bits/stdc++.h>   #pragma comment(linker,  /STACK:1108864220 )   using namespace std;   const int MOD = 1000000007;   const int INF = 1000000000;   const double EPS = 1e-9;   const int HASH_POW = 29;   const long double PI = acos(-1.0);   mt19937_64 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());   long long nextLong(long long l, long long r) {     uniform_int_distribution<long long> foo(l, r);     return foo(rnd);   }   double nextDouble(double l, double r) {     uniform_real_distribution<double> foo(l, r);     return foo(rnd);   }   double workTime() { return double(clock()) / CLOCKS_PER_SEC; }   void myReturn(int code = 0) { exit(code); }   int n;   long long goal = 0;   vector<int> p[15];   vector<long long> sum;   unordered_map<int, pair<int, int> > pos;   pair<int, int> cycles[1 << 15];   bool dp[1 << 15];   int par[1 << 15];   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     scanf( %d , &n);     sum.resize(n);     for (int i = 0; i < n; ++i) {       int s;       scanf( %d , &s);       p[i].resize(s);       sum[i] = 0;       for (int j = 0; j < s; ++j) {         scanf( %d , &p[i][j]);         goal += p[i][j];         sum[i] += p[i][j];         pos[p[i][j]] = {i, j};       }     }     if (goal % n != 0) {       printf( No n );       myReturn();     } else {       goal /= n;     }     for (int i = 0; i < (1 << n); ++i) {       cycles[i] = {-1, -1};     }     for (int i = 0; i < n; ++i) {       for (int j = 0; j < p[i].size(); ++j) {         int msk = 0, row = i, col = j;         bool good = true;         while (true) {           if (msk & (1 << row)) {             if (row != i) {               good = false;             } else if (col != j) {               good = false;             }             break;           }           msk |= (1 << row);           long long val = goal - sum[row] + p[row][col];           if (abs(val) > 1000000000) {             good = false;             break;           }           int key = (int)val;           if (pos.find(key) == pos.end()) {             good = false;             break;           }           if (pos[key].first == row && pos[key].second != col) {             good = false;             break;           }           row = pos[key].first, col = pos[key].second;         }         if (good) {           cycles[msk] = {i, j};         }       }     }     dp[0] = true;     for (int i = 1; i < (1 << n); ++i) {       for (int s = i; s > 0; s = ((s - 1) & i)) {         if (cycles[s].first != -1 && dp[i ^ s]) {           dp[i] = true;           par[i] = s;         }       }     }     if (!dp[(1 << n) - 1]) {       printf( No n );       myReturn();     }     vector<pair<int, int> > ans(n, {-1, -1});     int q = (1 << n) - 1;     while (q != 0) {       int s = par[q];       q ^= s;       int msk = 0, row = cycles[s].first, col = cycles[s].second;       while (true) {         if (msk & (1 << row)) {           break;         }         msk |= (1 << row);         long long val = goal - sum[row] + p[row][col];         int key = (int)val;         ans[pos[key].first] = {p[pos[key].first][pos[key].second], row + 1};         row = pos[key].first, col = pos[key].second;       }     }     printf( Yes n );     for (int i = 0; i < n; ++i) {       printf( %d %d n , ans[i].first, ans[i].second);     }     myReturn();   }