#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> a[16];
long long sumBox[16];
map<long long, int> boxId;
bool trueMask[1 << 16];
bool dp[1 << 16];
vector<pair<int, int> > cycle[1 << 16];
int cpnt[1 << 16];
vector<pair<int, int> > ans;
void getAns(int mask) {
  if (!trueMask[mask]) {
    getAns(cpnt[mask]);
    getAns(mask ^ cpnt[mask]);
  } else {
    int sz = cycle[mask].size();
    for (int i = int(0); i < int(cycle[mask].size()); i++) {
      pair<int, int> p = cycle[mask][i];
      ans[p.first] =
          make_pair(p.second, cycle[mask][(i - 1 + sz) % sz].first + 1);
    }
  }
}
void solve() {
  long long avg = 0;
  for (int i = int(0); i < int(n); i++) {
    sort(a[i].begin(), a[i].end());
  }
  for (int i = int(0); i < int(n); i++) {
    for (int j = int(0); j < int(a[i].size()); j++) {
      avg += a[i][j];
      sumBox[i] += a[i][j];
      boxId[a[i][j]] = i;
    }
  }
  if (avg % n) {
    printf("No\n");
    return;
  }
  avg /= n;
  memset(trueMask, 0, sizeof trueMask);
  for (int i = int(0); i < int(n); i++) {
    for (int j = int(0); j < int(a[i].size()); j++) {
      int mask = 0;
      int curBox = i, lastVal = a[i][j];
      bool firstTurn = true, bad = false;
      vector<pair<int, int> > tmp;
      while (firstTurn || curBox != i) {
        if (mask & (1 << curBox)) {
          bad = true;
          break;
        }
        firstTurn = 0;
        mask |= (1 << curBox);
        tmp.push_back(make_pair(curBox, lastVal));
        long long needVal = avg - sumBox[curBox] + lastVal;
        if (boxId.count(needVal) == 0) {
          bad = true;
          break;
        }
        curBox = boxId[needVal];
        lastVal = needVal;
      }
      if (!bad) {
        if (lastVal == a[i][j]) {
          if (!trueMask[mask]) {
            trueMask[mask] = 1;
            cycle[mask] = tmp;
          }
        }
      }
    }
  }
  memset(dp, 0, sizeof dp);
  for (int i = int(0); i < int((1 << n)); i++) {
    if (trueMask[i]) dp[i] = 1;
    for (int subMask = i; subMask; subMask = (subMask - 1) & i) {
      if (dp[subMask] && dp[subMask ^ i]) {
        dp[i] = 1;
        cpnt[i] = subMask;
        break;
      }
    }
  }
  if (!dp[(1 << n) - 1]) {
    printf("No\n");
  } else {
    printf("Yes\n");
    ans.resize(n);
    getAns((1 << n) - 1);
    for (int i = int(0); i < int(n); i++) {
      printf("%d %d\n", ans[i].first, ans[i].second);
    }
  }
}
int main() {
  int k, kase = 0;
  k = 1;
  while (k--) {
    scanf("%d", &n);
    int ni;
    for (int i = int(0); i < int(n); i++) {
      scanf("%d", &ni);
      a[i].resize(ni);
      for (int j = int(0); j < int(ni); j++) {
        scanf("%d", &a[i][j]);
      }
    }
    solve();
  }
  return 0;
}
