#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005 * 15, mod = 1e9 + 7;
vector<long long> a[15];
map<long long, int> mp;
int v[5005 * 15], bl[5005 * 15], ok[5005 * 15], r[5005 * 15];
pair<int, int> ans[15], from[5005 * 15];
long long sum[15];
long long avg;
int k, n, cnt = 0;
bool OK;
bool dp[5005 * 15], have[5005 * 15];
vector<int> cir;
struct Graph {
  int n, cir;
  void init(int _n) {
    n = _n, cir = 0;
    for (int i = 0; i < n; i++) f[i] = bl[i] = -1;
  }
  int bl[maxn], ins[maxn], sta[maxn], vis[maxn], top = 0, f[maxn];
  vector<int> g[5005 * 15];
  void add(int u, int v) { g[u].push_back(v); }
  void find_circle() {
    for (int i = 0; i < n; i++) {
      if (!vis[i]) dfs(i);
    }
  }
  void dfs(int u) {
    vis[u] = 1;
    ins[u] = 1;
    sta[top++] = u;
    for (auto v : g[u]) {
      if (ins[v]) {
        int p = top - 1;
        while (1) {
          bl[sta[p]] = cir;
          if (sta[p] == v) {
            f[v] = u;
            break;
          }
          f[sta[p]] = sta[p - 1];
          p--;
        }
        cir++;
      }
      if (!vis[v]) dfs(v);
    }
    ins[u] = 0;
    top--;
  }
  void print() {
    for (int i = 0; i < n; i++) {
      for (auto v : g[i]) cout << i << ' ' << v << endl;
    }
  }
} G;
int f(int i, long long out) {
  long long v_out = -(sum[i] - avg - out);
  if (mp.count(v_out) == 0) return -1;
  int idx = mp[v_out];
  if (bl[idx] == i) return -1;
  return idx;
}
void print_res() {
  if (!OK) {
    cout << "No" << endl;
    return;
  }
  cout << "Yes" << endl;
  for (int i = 0; i < k; i++) {
    cout << ans[i].first << ' ' << ans[i].second + 1 << endl;
  }
}
void mark(int s) {
  ok[s] = 1;
  int x = from[s].first, y = from[s].second;
  assert(x ^ y == s);
  if (x == 0 || y == 0) return;
  mark(x);
  mark(y);
}
int main() {
  int T = 1;
  while (T--) {
    OK = 1;
    cin >> k;
    avg = 0;
    for (int i = 0; i < k; i++) {
      cin >> n;
      while (n--) {
        int a0;
        cin >> a0;
        a[i].push_back(cnt);
        mp[a0] = cnt;
        v[cnt] = a0;
        bl[cnt] = i;
        sum[i] += a0;
        cnt++;
      }
      avg += sum[i];
    }
    G.init(cnt);
    if (avg % k) {
      cout << "No" << endl;
      continue;
    }
    avg /= k;
    for (int i = 0; i < k; i++) {
      for (auto j : a[i]) {
        if (sum[i] == avg) {
          G.add(j, j);
          continue;
        }
        auto idx = f(i, v[j]);
        if (idx != -1) G.add(j, idx);
      }
    }
    G.find_circle();
    cir.resize(G.cir);
    for (int i = 0; i < G.cir; i++) ok[i] = 1;
    for (int i = 0; i < cnt; i++)
      if (G.bl[i] != -1) {
        if (cir[G.bl[i]] & (1 << bl[i])) ok[G.bl[i]] = 0;
        cir[G.bl[i]] |= (1 << bl[i]);
      }
    for (int i = 0; i < (1 << k); i++) r[i] = -1;
    for (int i = 0; i < G.cir; i++) {
      if (!have[cir[i]] && ok[i]) {
        r[cir[i]] = i;
        dp[cir[i]] = 1, from[cir[i]] = make_pair(0, cir[i]);
      }
      have[cir[i]] = 1;
    }
    dp[0] = 1;
    for (int S = 0; S < (1 << k); S++) {
      for (int s = S; s && dp[S] == 0; s = S & (s - 1)) {
        if (dp[s] && dp[S - s]) {
          dp[S] = 1;
          from[S] = make_pair(s, S - s);
        }
      }
    }
    for (int i = 0; i < G.cir; i++) ok[i] = 0;
    if (dp[(1 << k) - 1] == 0)
      OK = 0;
    else {
      OK = 1;
      mark((1 << k) - 1);
      for (int i = 0; i < cnt; i++) {
        if (G.bl[i] != -1 && ok[cir[G.bl[i]]] && r[cir[G.bl[i]]] == G.bl[i]) {
          ans[bl[i]] = make_pair(v[i], bl[G.f[i]]);
        }
      }
    }
    print_res();
  }
  return 0;
}
