#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;
}
