#include <bits/stdc++.h>
using namespace std;
const int INF = 2147483647;
const long long LLINF = 9223372036854775807LL;
int k_count;
map<long long, int> box_ind;
map<long long, int> color;
vector<long long> box_sum;
long long target_sum;
long long cinf = (long long)1e9 + 100;
vector<pair<int, vector<long long> > > found_cycles;
int dp[(1 << 15) + 10];
int pred[(1 << 15) + 10];
vector<vector<int> > mbybit(17);
int get_min_bit(int x) {
  for (int j = 0; j < 20; ++j) {
    if (x & (1 << j)) return j;
  }
  return -1;
}
void doh() {
  printf("No\n");
  exit(0);
}
long long get_next_num(long long cur_num) {
  long long rem_sum = box_sum[box_ind[cur_num]] - cur_num;
  long long diff_to_target = target_sum - rem_sum;
  if (box_ind.find(diff_to_target) == box_ind.end()) return cinf;
  return diff_to_target;
}
void rec(long long num) {
  color[num] = 2;
  long long next_num = get_next_num(num);
  if (next_num != cinf) {
    int nnum_color = color[next_num];
    if (nnum_color == 0)
      rec(next_num);
    else if (nnum_color == 2) {
      vector<long long> cur_cycle;
      long long cur = next_num;
      int cur_mask = 0;
      bool ok = true;
      do {
        cur_cycle.push_back(cur);
        if (cur_mask & (1 << box_ind[cur])) {
          ok = false;
          break;
        }
        cur_mask |= 1 << box_ind[cur];
        cur = get_next_num(cur);
      } while (cur != next_num);
      if (ok) found_cycles.push_back(make_pair(cur_mask, cur_cycle));
    }
  }
  color[num] = 1;
}
int main() {
  scanf("%d", &k_count);
  vector<vector<long long> > nums_in_box(k_count);
  long long total_sum = 0;
  for (int ii = 0; ii < k_count; ++ii) {
    int ni;
    scanf("%d", &ni);
    long long cur_sum = 0;
    for (int j = 0; j < ni; ++j) {
      int cnum;
      scanf("%d", &cnum);
      box_ind[(long long)cnum] = ii;
      total_sum += cnum;
      cur_sum += cnum;
      nums_in_box[ii].push_back((long long)cnum);
    }
    box_sum.push_back(cur_sum);
  }
  if (total_sum % k_count) doh();
  target_sum = total_sum / k_count;
  for (int i = 0; i < k_count; ++i)
    for (long long nib : nums_in_box[i])
      if (color[nib] == 0) rec(nib);
  for (int cind = 0; cind < int((found_cycles).size()); ++cind) {
    mbybit[get_min_bit(found_cycles[cind].first)].push_back(cind);
  }
  dp[0] = 1;
  pred[0] = -1;
  for (int msk = 0; msk < (1 << k_count); ++msk) {
    if (dp[msk] == 0) continue;
    int fbit = 0;
    while ((msk & (1 << fbit))) fbit += 1;
    for (int c_ind : mbybit[fbit]) {
      auto cr = found_cycles[c_ind];
      int oth_mask = cr.first;
      if ((msk & oth_mask) == 0) {
        int to_mask = msk | oth_mask;
        dp[to_mask] = 1;
        pred[to_mask] = c_ind;
      }
    }
  }
  if (!dp[(1 << k_count) - 1]) doh();
  vector<long long> res_nums;
  int cur_mask = (1 << k_count) - 1;
  while (cur_mask > 0) {
    auto cc = found_cycles[pred[cur_mask]];
    res_nums.insert(res_nums.end(), cc.second.begin(), cc.second.end());
    int to_mask = cc.first ^ cur_mask;
    cur_mask = to_mask;
  }
  printf("Yes\n");
  vector<pair<long long, int> > res_by_bind(k_count);
  for (long long r_num : res_nums) {
    res_by_bind[box_ind[get_next_num(r_num)]] =
        make_pair(get_next_num(r_num), box_ind[r_num]);
  }
  for (int bind = 0; bind < k_count; ++bind) {
    cout << res_by_bind[bind].first << " " << res_by_bind[bind].second + 1
         << endl;
  }
  return 0;
}
