#include <bits/stdc++.h>
using namespace std;
unordered_map<long long, long long> need, color_2, color_1;
vector<vector<long long> > vec(16);
vector<pair<long long, long long> > op[1 << 17];
bool dp[1 << 17];
long long k, sum, aver, vec_sum[16];
inline bool initial() {
  scanf("%lld", &k);
  for (long long i = 1; i <= k; i++) {
    long long n, t;
    scanf("%lld", &n);
    for (long long j = 1; j <= n; j++) {
      scanf("%lld", &t);
      vec[i].push_back(t);
      color_2[t] = 1 << (i - 1);
      color_1[t] = i;
      vec_sum[i] += t;
    }
    sum += vec_sum[i];
  }
  if (sum % k) return 0;
  aver = sum / k;
  for (long long i = 1; i <= k; i++) {
    for (long long j = 0; j < (long long)vec[i].size(); j++) {
      long long x = vec[i][j];
      long long ne = aver - (vec_sum[i] - x);
      need[x] = ne;
    }
  }
  return 1;
}
inline bool judge(long long s, long long ii) { return s & ii; }
inline void get_circle() {
  unordered_map<long long, long long>::iterator it, it1;
  vector<pair<long long, long long> > temp_op;
  for (long long i = 1; i <= k; i++) {
    for (long long ii = 0; ii < (long long)vec[i].size(); ii++) {
      long long x = vec[i][ii];
      long long n;
      long long c = x, s = 0;
      bool nice = 1;
      temp_op.clear();
      while (1) {
        n = need[c];
        it = color_2.find(n);
        it1 = color_1.find(c);
        if (it == color_2.end() || judge(s, it->second)) {
          nice = 0;
          break;
        }
        c = it->first;
        s += it->second;
        temp_op.push_back(make_pair(n, it1->second));
        if (c == x) break;
      }
      if (nice) {
        dp[s] = 1;
        op[s] = temp_op;
      }
    }
  }
}
bool cmp(const pair<long long, long long> &p1,
         const pair<long long, long long> &p2) {
  return color_1[p1.first] < color_1[p2.first];
}
void VecAdd(long long s, long long i, long long b) {
  for (long long ii = 0; ii < (long long)op[i].size(); ii++)
    op[s].push_back(op[i][ii]);
  for (long long ii = 0; ii < (long long)op[b].size(); ii++)
    op[s].push_back(op[b][ii]);
}
inline bool func_dp() {
  long long ff = (1 << k) - 1;
  for (long long s = 1; s <= ff; s++) {
    if (dp[s]) continue;
    for (long long i = s; i >= 0; i--) {
      i = i & s;
      long long b = s ^ i;
      if (dp[b] && dp[i]) {
        dp[s] = 1;
        VecAdd(s, i, b);
        break;
      }
    }
  }
  if (dp[ff])
    return 1;
  else
    return 0;
}
signed main() {
  if (!initial())
    printf("No\n");
  else {
    get_circle();
    if (!func_dp())
      printf("No\n");
    else {
      long long ff = (1 << k) - 1;
      printf("Yes\n");
      sort(op[ff].begin(), op[ff].end(), cmp);
      for (long long i = 0; i < (long long)op[ff].size(); i++) {
        pair<long long, long long> &tp = op[ff][i];
        printf("%lld %lld\n", tp.first, tp.second);
      }
    }
  }
  return 0;
}
