#include <bits/stdc++.h>
using namespace std;
const long long INF = 2e9;
const long long MOD = 1e9 + 7;
const long long MB = 30;
vector<vector<pair<long long, long long>>> g;
vector<vector<long long>> used;
long long k;
pair<long long, long long> dfs1(long long x, long long y) {
  used[x][y] = 1;
  auto p = g[x][y];
  if (p.first == -1) {
    used[x][y] = 2;
    return p;
  }
  long long a = p.first;
  long long b = p.second;
  if (used[a][b] == 2) {
    used[x][y] = 2;
    return {-1, -1};
  }
  if (used[a][b] == 1) {
    used[x][y] = 2;
    return {a, b};
  }
  auto r = dfs1(a, b);
  used[x][y] = 2;
  return r;
}
void dfs2(long long x, long long y, vector<pair<long long, long long>>& t,
          long long a, long long b) {
  t.push_back({x, y});
  auto p = g[x][y];
  x = p.first;
  y = p.second;
  if (x == a && y == b) return;
  dfs2(x, y, t, a, b);
}
void solve() {
  cin >> k;
  vector<long long> s(k);
  vector<vector<long long>> a(k);
  g.resize(k);
  used.resize(k);
  for (long long i = 0; i < k; i++) {
    long long n;
    cin >> n;
    a[i].resize(n);
    for (long long j = 0; j < n; j++) {
      cin >> a[i][j];
      s[i] += a[i][j];
    }
    sort(a[i].begin(), a[i].end());
    g[i].resize(n, {-1, -1});
    used[i].resize(n);
  }
  long long summ = 0;
  for (long long i = 0; i < k; i++) {
    summ += s[i];
  }
  if (summ % k != 0) {
    cout << "No";
    return;
  }
  long long q = summ / k;
  for (long long i = 0; i < k; i++) {
    for (long long j = 0; j < a[i].size(); j++) {
      long long y = q - s[i] + a[i][j];
      for (long long c = 0; c < k; c++) {
        auto id = lower_bound(a[c].begin(), a[c].end(), y);
        if (id == a[c].end() || *id != y) continue;
        g[i][j] = {c, (long long)(id - a[c].begin())};
        break;
      }
    }
  }
  vector<bool> good(1 << k);
  vector<pair<long long, long long>> par(1 << k);
  good[0] = true;
  for (long long i = 0; i < k; i++) {
    for (long long j = 0; j < a[i].size(); j++) {
      if (used[i][j]) continue;
      auto p = dfs1(i, j);
      if (p.first == -1) continue;
      vector<pair<long long, long long>> t;
      dfs2(p.first, p.second, t, p.first, p.second);
      long long res = 0;
      for (auto& w : t) {
        long long v = w.first;
        if ((res >> v) & 1) {
          res = 0;
          break;
        }
        res |= (1 << v);
      }
      good[res] = true;
      par[res] = p;
    }
  }
  vector<bool> dp(1 << k);
  vector<long long> p(1 << k);
  dp[0] = true;
  for (long long i = 1; i < (1 << k); i++) {
    long long mask = i;
    for (; mask > 0; mask = (mask - 1) & i) {
      long long mask1 = i ^ mask;
      if (dp[mask1] && good[mask]) {
        p[i] = mask1;
        dp[i] = true;
        break;
      }
    }
  }
  if (!dp[(1 << k) - 1]) {
    cout << "No";
    return;
  }
  vector<pair<long long, long long>> ans(k);
  long long now = (1 << k) - 1;
  while (now) {
    long long mask = now ^ p[now];
    auto pp = par[mask];
    vector<pair<long long, long long>> t;
    dfs2(pp.first, pp.second, t, pp.first, pp.second);
    long long n = t.size();
    for (long long i = 0; i < n; i++) {
      long long to = t[i].first;
      long long from = t[(i + 1) % n].first;
      long long v = a[from][t[(i + 1) % n].second];
      ans[from] = {v, to + 1};
    }
    now = p[now];
  }
  cout << "Yes\n";
  for (auto& p : ans) {
    cout << p.first << " " << p.second << '\n';
  }
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cout.precision(12);
  solve();
}
