#include <bits/stdc++.h>
using namespace std;
const int N = 5001;
const int K = 16;
long long S[K];
long long edg[N * K], A[N * K], BX[N * K], poss[1 << (K - 1)];
vector<pair<int, int>> lol[1 << (K - 1)];
pair<int, int> L[1 << (K - 1)];
map<long long, int> bx;
int main() {
  memset(edg, -1, sizeof(edg));
  int k;
  scanf("%d", &k);
  long long V = 0;
  int nd = 0;
  for (int i = 1; i <= k; ++i) {
    int n;
    scanf("%d", &n);
    for (int j = 1; j <= n; ++j) {
      ++nd;
      int x;
      scanf("%d", &x);
      A[nd] = x;
      V += x;
      S[i] += x;
      BX[nd] = i;
      bx[x] = nd;
    }
  }
  if (V % k != 0) {
    puts("no");
    return 0;
  }
  V /= k;
  for (int i = 1; i <= nd; ++i) {
    long long y = V - (S[BX[i]] - A[i]);
    if (bx.count(y)) edg[i] = bx[y];
  }
  vector<int> vis(nd + 1);
  vector<pair<int, int>> cyc;
  int z = 0;
  function<pair<int, int>(int)> haku = [&](int s) -> pair<int, int> {
    if (vis[s] == z) return {s, 1};
    if (vis[s]) return {0, 0};
    vis[s] = z;
    if (edg[s] != -1) {
      auto u = haku(edg[s]);
      if (u.second) {
        if (u.second) cyc.emplace_back(s, edg[s]);
        if (u.first == s) u.second = 0;
      }
      return u;
    }
    return {0, 0};
  };
  for (int i = 1; i <= nd; ++i) {
    if (!vis[i]) {
      cyc.clear();
      ++z;
      auto u = haku(i);
      if (cyc.empty()) continue;
      int m = 0, ok = 1;
      for (auto u : cyc) {
        if (m & (1 << (BX[u.first] - 1))) ok = 0;
        m |= 1 << (BX[u.first] - 1);
      }
      if (ok == 0) continue;
      poss[m]++;
      lol[m] = cyc;
    }
  }
  for (int i = 1; i < (1 << k); ++i) {
    if (poss[i]) {
      L[i] = {-1, -1};
      continue;
    }
    for (int j = (i - 1) & i; j; j = (j - 1) & i) {
      if (poss[j] && poss[j ^ i]) {
        L[i] = {j, j ^ i};
        poss[i] = 1;
        break;
      }
    }
  }
  if (!poss[(1 << k) - 1]) {
    puts("no");
    return 0;
  }
  puts("yes");
  vector<pair<int, int>> res(k + 1);
  function<void(int)> H = [&](int s) {
    if (L[s].first == -1) {
      for (auto [x, y] : lol[s]) {
        res[BX[y]] = {A[y], BX[x]};
      }
      return;
    }
    H(L[s].first);
    H(L[s].second);
  };
  H((1 << k) - 1);
  for (int i = 1; i <= k; ++i) {
    printf("%d %d\n", res[i].first, res[i].second);
  }
}
