#include <bits/stdc++.h>
using namespace std;
const int N = 5005;
const int M = 20;
const int K = M * N;
int k, ni, cnt = 1, to[K] = {}, dp[(1 << 15) + 5], pre[(1 << 15) + 5];
int ansq[M] = {}, alu[(1 << 15) + 5];
unordered_set<int> st;
unordered_map<long long, int> mp;
long long sum = 0, s, tot[M] = {}, ansp[M] = {};
struct Node {
  int k, id;
  long long val;
} p[K];
int vis[K] = {};
void dfs(int cur) {
  vis[cur] = 1;
  int tmp = to[cur];
  if (tmp) {
    if (vis[tmp] == 1) {
      int stat = 0, i = tmp;
      while (i != cur) {
        if (stat & (1 << (p[i].k))) {
          vis[cur] = -1;
          return;
        }
        stat |= (1 << (p[i].k));
        i = to[i];
      }
      if (stat & (1 << (p[cur].k))) {
        vis[cur] = -1;
        return;
      }
      stat |= (1 << (p[cur].k));
      st.insert(stat);
      alu[stat] = cur;
    } else if (vis[tmp] == 0) {
      dfs(tmp);
    }
  }
  vis[cur] = -1;
  return;
}
int main(void) {
  st.clear();
  mp.clear();
  scanf("%d", &k);
  for (int i = 0; i < k; ++i) {
    scanf("%d", &ni);
    for (int j = 0; j < ni; ++j) {
      scanf("%lld", &s);
      sum += s;
      p[cnt].k = i;
      p[cnt].id = j;
      p[cnt].val = s;
      mp[s] = (cnt++);
      tot[i] += s;
    }
  }
  if (sum % k) {
    printf("No\n");
    return 0;
  }
  s = sum / k;
  long long tmp;
  int pos, cc;
  for (int i = 1; i < cnt; ++i) {
    tmp = p[i].val;
    cc = p[i].k;
    if (tmp == s - (tot[cc] - tmp)) {
      to[i] = i;
    } else {
      if (mp.find(s - (tot[cc] - tmp)) != mp.end()) {
        pos = mp[s - (tot[cc] - tmp)];
        if (p[i].k != p[pos].k) {
          to[i] = pos;
        }
      }
    }
  }
  for (int i = 1; i < cnt; ++i) {
    if (!vis[i]) {
      dfs(i);
    }
  }
  dp[0] = 1;
  int lim = (1 << k);
  for (int i = 1; i < lim; ++i) {
    int j = i;
    while (j) {
      if (st.find(j) != st.end()) {
        dp[i] = dp[i - j];
        if (dp[i]) {
          pre[i] = j;
          break;
        }
      }
      j = ((j - 1) & i);
    }
  }
  --lim;
  if (!dp[lim]) {
    printf("No\n");
    return 0;
  }
  printf("Yes\n");
  int cur, flag;
  while (lim) {
    cur = pre[lim];
    flag = 0;
    for (int i = alu[cur];; i = to[i]) {
      if (i == alu[cur]) {
        if (!flag)
          flag = 1;
        else
          break;
      }
      ansp[p[to[i]].k] = p[to[i]].val;
      ansq[p[to[i]].k] = p[i].k;
    }
    lim ^= cur;
  }
  for (int i = 0; i < k; ++i) {
    printf("%lld %d\n", ansp[i], ansq[i] + 1);
  }
  return 0;
}
