#include <bits/stdc++.h>
using namespace std;
struct node {
  int cir;
  vector<int> rood;
} p[5005 * 20];
struct ans {
  int a, b;
} fina[20];
int k, N, val[5005 * 20], bel[5005 * 20], dfn[5005 * 20], low[5005 * 20], cnt,
    num;
long long tot, s[20];
map<long long, int> mp;
stack<int> S;
vector<int> G[5005 * 20];
vector<int> F[(1 << 15)];
void Tarjan(int x) {
  dfn[x] = low[x] = ++cnt;
  S.push(x);
  for (int i = 0; i < G[x].size(); i++) {
    int tmp = G[x][i];
    if (!dfn[tmp]) {
      Tarjan(tmp);
      low[x] = min(low[x], low[tmp]);
    } else {
      low[x] = min(dfn[tmp], low[x]);
    }
  }
  if (dfn[x] == low[x]) {
    num++;
    int v;
    bool flag = 0;
    do {
      v = S.top();
      S.pop();
      if (p[num].cir & (1 << (bel[v] - 1))) flag = 1;
      p[num].rood.push_back(v);
      p[num].cir |= (1 << (bel[v] - 1));
    } while (v != x);
    if (flag || !G[x].size() || (p[num].rood.size() == 1 && G[x][0] != x)) {
      p[num].cir = 0;
      p[num].rood.clear();
      num--;
      return;
    }
    if (!F[p[num].cir].size()) F[p[num].cir].push_back(num);
  }
}
int main() {
  scanf("%d", &k);
  for (int i = 1; i <= k; i++) {
    int n;
    scanf("%d", &n);
    while (n--) {
      N++;
      scanf("%d", &val[N]);
      bel[N] = i;
      s[i] += 1ll * val[N];
      mp[1ll * val[N]] = N;
    }
    tot += s[i];
  }
  if (tot % (long long)k != 0) {
    printf("No\n");
    return 0;
  }
  tot = tot / (long long)k;
  for (int i = 1; i <= N; i++) {
    if (mp[tot - s[bel[i]] + 1ll * val[i]]) {
      int u = i, v = mp[tot - s[bel[i]] + val[i]];
      G[u].push_back(v);
    }
  }
  for (int i = 1; i <= N; i++) {
    if (!dfn[i]) Tarjan(i);
  }
  for (int i = 0; i < (1 << k); i++) {
    for (int j = ((i - 1) & i); j; j = ((j - 1) & i)) {
      if (F[j].size() && F[i ^ j].size()) {
        F[i] = F[i ^ j];
        for (int k = 0; k < F[j].size(); k++) F[i].push_back(F[j][k]);
        break;
      }
    }
  }
  if (F[(1 << k) - 1].size()) {
    for (int i = 0; i < F[(1 << k) - 1].size(); i++) {
      int tmp = F[(1 << k) - 1][i], j;
      for (j = 0; j < p[tmp].rood.size() - 1; j++) {
        int now1 = p[tmp].rood[j], now2 = p[tmp].rood[j + 1];
        fina[bel[now1]].a = val[now1], fina[bel[now1]].b = bel[now2];
      }
      int now1 = p[tmp].rood[j], now2 = p[tmp].rood[0];
      fina[bel[now1]].a = val[now1], fina[bel[now1]].b = bel[now2];
    }
    printf("Yes\n");
    for (int i = 1; i <= k; i++) printf("%d %d\n", fina[i].a, fina[i].b);
  } else
    printf("No\n");
  return 0;
}
