#include <bits/stdc++.h>
using namespace std;
long long gra[16 * 5005];
long long id(long long k, long long p) { return (k - 1) * 5000 + p; }
map<long long, long long> ori, to;
bool dp[1 << 16];
long long k, a[20][5005], d[75005], tok[75005], top[75005];
vector<long long> cyc[75005], dpv[50000];
long long ct, ansdp[75005], ans1[20], ans2[20];
void gt(long long cur) {
  long long siz = dpv[cur].size();
  if (!siz) {
    long long tt = ansdp[cur];
    long long sz = (long long)cyc[tt].size();
    for (long long i = 0; i < sz; i++) {
      long long nxt;
      if (i == sz - 1)
        nxt = cyc[tt][0];
      else
        nxt = cyc[tt][i + 1];
      long long kk = tok[nxt], pp = top[nxt];
      ans1[kk] = a[kk][pp];
      ans2[kk] = tok[cyc[tt][i]];
    }
    return;
  }
  for (long long i = 0; i < siz; i++) gt(dpv[cur][i]);
}
int main() {
  scanf("%lld", &k);
  long long sum = 0;
  for (long long i = 1; i <= k; i++) {
    long long n;
    scanf("%lld", &n);
    a[i][0] = n;
    for (long long j = 1; j <= n; j++) {
      long long x;
      scanf("%lld", &x);
      sum += x;
      to[x] = id(i, j);
      tok[id(i, j)] = i;
      top[id(i, j)] = j;
      ori[x] = i;
      a[i][j] = x;
    }
  }
  if (sum % k) {
    cout << "NO\n";
    return 0;
  }
  sum /= k;
  for (long long i = 1; i <= k; i++) {
    long long ss = 0;
    for (long long j = 1; j <= a[i][0]; j++) ss += a[i][j];
    for (long long j = 1; j <= a[i][0]; j++) {
      long long tmp = sum - ss + a[i][j];
      long long tt = to[tmp];
      gra[id(i, j)] = tt;
    }
  }
  for (long long i = 1; i <= k; i++) {
    for (long long j = 1; j <= a[i][0]; j++) {
      long long now = id(i, j), pre = now, tid = 0;
      if (d[now]) continue;
      int dd[20] = {0};
      vector<long long> tt;
      while (now && !d[now]) {
        if (dd[tok[now]]) break;
        d[now] = 1;
        dd[tok[now]] = 1;
        tt.push_back(now);
        tid |= (1 << (tok[now] - 1));
        now = gra[now];
      }
      if (now == pre) {
        dp[tid] = true;
        cyc[++ct] = tt;
        ansdp[tid] = ct;
      } else {
        while (pre && pre != now) d[pre] = 0, pre = gra[pre];
        d[pre] = 0;
      }
    }
  }
  for (long long i = 1; i <= (1 << (k)) - 1; i++) {
    if (dp[i]) continue;
    for (long long j = i; j; j = (j - 1) & i) {
      if (dp[j] && dp[i ^ j]) {
        dp[i] = true;
        dpv[i].push_back(j);
        dpv[i].push_back(i ^ j);
        break;
      }
    }
  }
  if (!dp[(1 << k) - 1]) {
    cout << "NO";
    return 0;
  }
  cout << "YES\n";
  gt((1 << k) - 1);
  for (long long i = 1; i <= k; i++) cout << ans1[i] << " " << ans2[i] << endl;
  return 0;
}
