#include <bits/stdc++.h>
using namespace std;
const long long maxK = 15;
const long long maxN = 5000;
void bad() {
  cout << "No" << '\n';
  exit(0);
}
long long k, sum = 0, target;
vector<long long> Ns(maxK), Si(maxK);
vector<bool> dp((1 << maxK), false);
vector<long long> path((1 << maxK), -1);
vector<vector<pair<long long, pair<long long, long long>>>> cycles(1 << maxK);
vector<vector<long long>> ele(maxK, vector<long long>(maxN));
map<long long, long long> findEle;
vector<pair<long long, long long>> ans(maxK);
void findCycles() {
  for (long long i = 0; i < k; i++) {
    for (long long j = 0; j < Ns[i]; j++) {
      long long mask = (1 << i);
      long long prev = i;
      bool pos = true;
      long long findNext = target - Si[i] + ele[i][j];
      vector<pair<long long, pair<long long, long long>>> connect;
      while (1) {
        if (!findEle.count(findNext)) {
          pos = false;
          break;
        }
        long long box = findEle[findNext];
        if ((((1 << box) & mask) && (box != i)) ||
            ((box == i) && (findNext != ele[i][j]))) {
          pos = false;
          break;
        }
        if (box == i) {
          connect.push_back({box, {prev, findNext}});
          break;
        }
        connect.push_back({box, {prev, findNext}});
        mask |= (1 << box);
        prev = box;
        findNext = target - Si[box] + findNext;
      }
      if (pos) {
        dp[mask] = true;
        cycles[mask] = connect;
      }
    }
  }
}
void dfs(long long mask) {
  if (cycles[mask].size()) {
    for (auto i : cycles[mask]) {
      ans[i.first] = {i.second.second, i.second.first + 1};
    }
    return;
  }
  long long one = path[mask];
  long long two = (mask ^ path[mask]);
  dfs(one);
  dfs(two);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> k;
  for (long long i = 0; i < k; i++) {
    cin >> Ns[i];
    for (long long j = 0; j < Ns[i]; j++) {
      cin >> ele[i][j];
      findEle[ele[i][j]] = i;
      sum += ele[i][j];
      Si[i] += ele[i][j];
    }
  }
  if (sum % k) bad();
  target = sum / k;
  findCycles();
  for (long long i = 1; i < (1 << k); i++) {
    if (!dp[i]) continue;
    for (long long j = i; j < (1 << k); j = i | (j + 1)) {
      if (!dp[(j ^ i)]) continue;
      dp[j] = true;
      path[j] = i;
    }
  }
  if (!dp[(1 << k) - 1]) bad();
  cout << "Yes" << '\n';
  dfs((1 << k) - 1);
  for (long long i = 0; i < k; i++) {
    cout << ans[i].first << " " << ans[i].second << '\n';
  }
  return 0;
}
