#include <bits/stdc++.h>
using namespace std;
template <class A, class B>
ostream& operator<<(ostream& out, const pair<A, B>& a) {
  return out << "(" << a.first << ", " << a.second << ")";
}
template <class A>
ostream& operator<<(ostream& out, const vector<A>& a) {
  out << "[";
  for (auto it = a.begin(); it != a.end(); ++it) {
    if (it != a.begin()) out << ", ";
    out << *it;
  }
  return out << "]";
}
mt19937 rnd(time(NULL));
mt19937_64 rnd64(time(NULL));
const int INF = 1e9;
const long long INF64 = 1e18;
const int MOD = 1e9 + 7;
const long double PI = acosl(-1.0);
const long double EPS = 1e-9;
const int N = 16;
int k;
vector<long long> a[N];
long long sums[N];
vector<pair<long long, pair<int, int>>> vals;
bool read() {
  if (scanf("%d", &k) != 1) return false;
  for (int i = 0; i < int(k); ++i) {
    int n;
    scanf("%d", &n);
    a[i].resize(n);
    for (int j = 0; j < int(n); ++j) {
      scanf("%lld", &a[i][j]);
      vals.push_back(make_pair(a[i][j], make_pair(i, j)));
    }
    sums[i] = accumulate((a[i]).begin(), (a[i]).end(), 0ll);
  }
  return true;
}
int cyc[1 << N];
int dp[1 << N];
int p[1 << N];
vector<pair<int, long long>> res[1 << N];
void solve() {
  sort((vals).begin(), (vals).end());
  long long sum = 0;
  for (int i = 0; i < int(k); ++i) sum += sums[i];
  if (sum % k != 0) {
    puts("No");
    return;
  }
  sum /= k;
  for (int i = 0; i < int(k); ++i) {
    if (sums[i] == sum) {
      cyc[1 << i] = 1;
      res[1 << i].push_back(make_pair(i, a[i][0]));
    }
    for (int j = 0; j < int(int((a[i]).size())); ++j) {
      vector<pair<int, long long>> cur;
      bool ok = true;
      int mask = (1 << i);
      int v = i;
      long long need = sum - (sums[i] - a[i][j]);
      while (true) {
        auto it = lower_bound((vals).begin(), (vals).end(),
                              make_pair(need, make_pair(-1, -1)));
        if (it == vals.end() || it->first != need) {
          ok = false;
          break;
        }
        int to = it->second.first;
        int idx = it->second.second;
        cur.push_back(make_pair(v, a[to][idx]));
        if ((mask >> to) & 1) {
          if (i != to || need != a[i][j]) ok = false;
          break;
        } else {
          need = sum - (sums[to] - a[to][idx]);
          v = to;
          mask |= (1 << to);
        }
      }
      if (ok && int((cur).size()) > 1) {
        cyc[mask] = 1;
        res[mask] = cur;
      }
    }
  }
  dp[0] = 1;
  for (int mask = 0; mask < int(1 << k); ++mask) {
    for (int smask = mask; smask > 0; smask = (smask - 1) & mask) {
      if (dp[mask ^ smask] & cyc[smask]) {
        dp[mask] = 1;
        p[mask] = smask;
      }
    }
  }
  if (!dp[(1 << k) - 1]) {
    puts("No");
    return;
  }
  puts("Yes");
  int mask = (1 << k) - 1;
  vector<pair<int, int>> ans(k);
  while (mask != 0) {
    int cycle = p[mask];
    mask ^= cycle;
    for (auto val : res[cycle]) {
      auto it = lower_bound((vals).begin(), (vals).end(),
                            make_pair(val.second, make_pair(-1, -1)));
      ans[it->second.first] = make_pair(val.second, val.first);
    }
  }
  for (auto it : ans) printf("%d %d\n", it.first, it.second + 1);
}
int main() {
  cout << fixed << setprecision(10);
  cerr << fixed << setprecision(10);
  if (read()) {
    solve();
  }
}
