#include <bits/stdc++.h>
using namespace std;
const long double eps = 1e-9;
const int inf = (1 << 30) - 1;
const long long inf64 = (1LL << 62) - 1;
const long double pi = acos(-1);
template <class T>
T sqr(T x) {
  return x * x;
}
template <class T>
T abs(T x) {
  return x < 0 ? -x : x;
}
bool Go(const vector<vector<long long>>& a,
        const vector<pair<long long, int>>& num_box,
        const vector<long long>& sum, int k, long long wanted_sum, int box,
        long long num, vector<pair<long long, pair<int, int>>>* res) {
  (*res).clear();
  vector<bool> good(k, true);
  vector<pair<int, long long>> st;
  st.push_back(make_pair(box, num));
  while (good[box]) {
    good[box] = false;
    long long new_num = wanted_sum - (sum[box] - num);
    int ind =
        lower_bound(num_box.begin(), num_box.end(), make_pair(new_num, -1)) -
        num_box.begin();
    if (ind >= ((int)(num_box).size()) || num_box[ind].first != new_num) {
      return false;
    }
    int new_box = num_box[ind].second;
    st.push_back(make_pair(new_box, new_num));
    box = new_box;
    num = new_num;
  }
  if (st[0] != st.back()) {
    return false;
  }
  for (int i = 0; i + 1 < ((int)(st).size()); ++i) {
    (*res).push_back(
        make_pair(st[i + 1].second, make_pair(st[i + 1].first, st[i].first)));
  }
  return true;
}
int GetMask(const vector<pair<long long, pair<int, int>>>& go_res) {
  int mask = 0;
  for (int i = 0; i < ((int)(go_res).size()); ++i) {
    mask |= (1 << go_res[i].second.first);
  }
  return mask;
}
int main() {
  ios_base::sync_with_stdio(0);
  int k;
  cin >> k;
  vector<vector<long long>> a(k);
  for (int i = 0; i < k; ++i) {
    int n;
    cin >> n;
    a[i].resize(n);
    for (int j = 0; j < n; ++j) {
      cin >> a[i][j];
    }
  }
  vector<pair<long long, int>> num_box;
  vector<long long> sum(k, 0);
  for (int i = 0; i < k; ++i) {
    for (int j = 0; j < ((int)(a[i]).size()); ++j) {
      sum[i] += a[i][j];
      num_box.push_back(make_pair(a[i][j], i));
    }
  }
  sort(num_box.begin(), num_box.end());
  long long wanted_sum = 0;
  for (int i = 0; i < k; ++i) {
    wanted_sum += sum[i];
  }
  if (wanted_sum % k != 0) {
    cout << "No\n";
    return 0;
  }
  wanted_sum /= k;
  vector<pair<long long, pair<int, int>>> go_res;
  vector<pair<int, long long>> how_mask((1 << k), make_pair(-1, -1));
  for (int i = 0; i < k; ++i) {
    for (int j = 0; j < ((int)(a[i]).size()); ++j) {
      if (Go(a, num_box, sum, k, wanted_sum, i, a[i][j], &go_res)) {
        int mask = GetMask(go_res);
        how_mask[mask] = make_pair(i, a[i][j]);
      }
    }
  }
  for (int mask = 1; mask < (1 << k); ++mask) {
    if (how_mask[mask].first != -1) {
      continue;
    }
    for (int sub_mask = ((mask - 1) & mask); sub_mask > (mask ^ sub_mask);
         sub_mask = ((sub_mask - 1) & mask)) {
      if (how_mask[sub_mask].first != -1 &&
          how_mask[mask ^ sub_mask].first != -1) {
        how_mask[mask] = how_mask[sub_mask];
      }
    }
  }
  if (how_mask[(1 << k) - 1].first == -1) {
    cout << "No\n";
    return 0;
  }
  vector<pair<long long, int>> res(k);
  int mask = (1 << k) - 1;
  while (mask > 0) {
    Go(a, num_box, sum, k, wanted_sum, how_mask[mask].first,
       how_mask[mask].second, &go_res);
    for (int i = 0; i < ((int)(go_res).size()); ++i) {
      res[go_res[i].second.first] =
          make_pair(go_res[i].first, go_res[i].second.second);
      mask ^= (1 << go_res[i].second.first);
    }
  }
  cout << "Yes\n";
  for (int i = 0; i < k; ++i) {
    cout << res[i].first << " " << res[i].second + 1 << "\n";
  }
  return 0;
}
