#include <bits/stdc++.h>
using namespace std;
const long long BIG = 1000000000000000000LL;
void solve();
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  solve();
  return 0;
}
long long nbBoxes;
long long reqSom = 0;
bool cycor[1 << 15];
pair<long long, pair<long long, long long> > cymem[1 << 15];
long long dpGo[1 << 15];
long long origSom[15];
vector<long long> yolo[15];
map<long long, long long> loc;
map<long long, long long> ds;
vector<long long> maskOk;
pair<long long, long long> finRes[15];
long long osef[15];
long long getMap(long long x) {
  auto it = loc.find(x);
  if (it == loc.end())
    return -1;
  else
    return it->second;
}
void tester(long long dep, long long valEnvoi, long long suiv,
            bool act = false) {
  if (dep == suiv) {
    if (origSom[dep] == reqSom) {
      cycor[1LL << dep] = true;
      cymem[1LL << dep] = {dep, {valEnvoi, suiv}};
      if (act) finRes[dep] = {dep, osef[dep]};
    }
    return;
  }
  long long gauche = dep;
  long long cg = reqSom - (origSom[dep] - valEnvoi);
  long long mask = (1LL << gauche) | (1LL << suiv);
  if (act) finRes[dep] = {suiv, valEnvoi};
  while (true) {
    long long prev = gauche;
    gauche = getMap(cg);
    if (gauche != -1 && act) finRes[gauche] = {prev, cg};
    if (gauche == -1 || gauche == suiv) break;
    if (mask & (1LL << gauche)) break;
    cg = reqSom - (origSom[gauche] - cg);
    mask |= (1LL << gauche);
  }
  if (gauche == suiv && origSom[suiv] + valEnvoi - cg == reqSom) {
    cycor[mask] = true;
    cymem[mask] = {dep, {valEnvoi, suiv}};
  }
}
void solve() {
  cin >> nbBoxes;
  for (long long i = (0); i < (nbBoxes); ++i) {
    long long ni;
    cin >> ni;
    for (long long i00 = (0); i00 < (ni); ++i00) {
      long long x;
      cin >> x;
      yolo[i].push_back(x);
      reqSom += x;
      origSom[i] += x;
      loc[x] = i;
      osef[i] = x;
    }
  }
  if (reqSom % nbBoxes != 0) {
    cout << "No\n";
    return;
  }
  reqSom /= nbBoxes;
  for (long long i = (0); i < (nbBoxes); ++i) {
    for (long long x : yolo[i]) {
      for (long long j = (0); j < (nbBoxes); ++j) {
        tester(i, x, j);
      }
    }
  }
  for (long long i = (0); i < ((1 << 15)); ++i) {
    dpGo[i] = -1;
    if (cycor[i]) maskOk.push_back(i);
  }
  dpGo[0] = 0;
  for (long long mask = (0); mask < ((1 << 15)); ++mask) {
    if (cycor[mask]) {
      dpGo[mask] = mask;
      continue;
    }
    for (long long potSub : maskOk) {
      if (potSub > mask) break;
      if ((potSub & mask) == potSub) {
        long long ret = mask ^ potSub;
        if (dpGo[ret] != -1) {
          dpGo[mask] = potSub;
          break;
        }
      }
    }
  }
  long long cur = (1LL << nbBoxes) - 1;
  while (dpGo[cur] != 0) {
    if (dpGo[cur] == -1) {
      cout << "No\n";
      return;
    }
    long long ret = dpGo[cur];
    long long dep = cymem[ret].first, valEnv = cymem[ret].second.first,
              suiv = cymem[ret].second.second;
    tester(dep, valEnv, suiv, true);
    cur ^= ret;
  }
  cout << "Yes\n";
  for (long long i = (0); i < (nbBoxes); ++i)
    cout << finRes[i].second << " " << finRes[i].first + 1 << "\n";
}
