#include <bits/stdc++.h>
const int N = 5000 * 15 + 5;
long long a[15 + 5][5000 + 5];
long long partSum[15 + 5];
int count[15 + 5];
long long b[N];
int total = 0;
int cycle[N];
int p[N];
int in[N];
int Q[N];
int vis[N];
int pass[15 + 5];
int power[15 + 5];
int option[2 << 17];
int f[2 << 17];
int last[2 << 17];
struct Element {
  long long c, p;
  Element(long long c = 0, long long p = 0) : c(c), p(p) {}
};
std::vector<Element> schedule[2 << 17];
Element output[15 + 5];
int getId(long long u) {
  int l = 1, r = total;
  int res = -1;
  while (l <= r) {
    int m = (l + r) / 2;
    if (b[m] <= u) {
      res = m;
      l = m + 1;
    } else
      r = m - 1;
  }
  return res;
}
void topo(int n) {
  int h = 0, t = -1;
  for (int i = 1; i <= n; i++) {
    if (!in[i]) {
      Q[++t] = i;
    }
  }
  while (h <= t) {
    int u = Q[h++];
    vis[u] = 1;
    int v = p[u];
    if (v == -1) continue;
    in[v]--;
    if (!in[v]) Q[++t] = v;
  }
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) {
      int start = i, u = i;
      for (int j = 1; j <= 15; j++) pass[j] = 0;
      do {
        pass[cycle[u]]++;
        vis[u] = 1;
        u = p[u];
      } while (u != start);
      int mask = 0, ok = 1;
      for (int j = 1; j <= 15; j++) {
        if (pass[j] != 0 && pass[j] != 1) {
          ok = 0;
          break;
        } else
          mask += power[j - 1] * pass[j];
      }
      if (ok && !option[mask]) {
        u = i;
        do {
          schedule[mask].push_back(Element(p[u], cycle[u]));
          vis[u] = 1;
          u = p[u];
        } while (u != start);
        option[mask] = 1;
      }
    }
  }
}
int main() {
  power[0] = 1;
  for (int i = 1; i <= 15; i++) power[i] = power[i - 1] * 2;
  long long k;
  scanf("%lld", &k);
  long long sum = 0;
  for (int i = 1; i <= k; i++) {
    scanf("%d", &count[i]);
    partSum[i] = 0;
    for (int j = 1; j <= count[i]; j++) {
      scanf("%lld", &a[i][j]);
      sum += a[i][j];
      partSum[i] += a[i][j];
      b[++total] = a[i][j];
    }
  }
  if (sum % k)
    printf("No\n");
  else {
    std::sort(b + 1, b + 1 + total);
    long long need = sum / k;
    for (int i = 1; i <= k; i++) {
      long long change = need - partSum[i];
      for (int j = 1; j <= count[i]; j++) {
        int u = getId(a[i][j]), v = getId(a[i][j] + change);
        cycle[u] = i;
        p[u] = v;
        if (v != -1) in[v]++;
      }
    }
    topo(total);
    f[0] = 1;
    for (int i = 0; i < (1 << k); i++) {
      for (int j = (i - 1) & i;; j = (j - 1) & i) {
        if (f[j]) {
          int need = i ^ j;
          if (f[i] == 0 && option[need]) {
            f[i] = 1;
            last[i] = j;
            break;
          }
        }
        if (j == 0) break;
      }
    }
    if (f[(1 << k) - 1]) {
      printf("Yes\n");
      int mask = (1 << k) - 1;
      while (mask != 0) {
        int used = mask ^ last[mask];
        for (unsigned int i = 0; i < schedule[used].size(); i++) {
          long long x = b[schedule[used][i].c], y = schedule[used][i].p;
          int from = cycle[schedule[used][i].c];
          output[from] = Element(x, y);
        }
        mask = last[mask];
      }
      for (int i = 1; i <= k; i++)
        printf("%lld %lld\n", output[i].c, output[i].p);
    } else
      printf("No\n");
  }
  return 0;
}
