#include <bits/stdc++.h>
using namespace std;
int32_t main() {
  ios::sync_with_stdio(0);
  cout.tie(0);
  cin.tie(0);
  long long k;
  cin >> k;
  long long sum = 0;
  map<long long, long long> m;
  vector<long long> ssum(k, 0), g(5005 * k, -1);
  vector<vector<long long>> a(k);
  vector<pair<long long, long long>> v;
  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];
      m[a[i][j]] = v.size();
      v.emplace_back(a[i][j], i);
      ssum[i] += a[i][j];
    }
    sum += ssum[i];
  }
  if (sum % k) {
    cout << "No\n";
    return 0;
  }
  sum /= k;
  for (long long i = 0; i < k; ++i) {
    for (long long j = 0; j < (long long)a[i].size(); ++j) {
      if (m.count(sum - ssum[i] + a[i][j])) {
        long long id = m[sum - ssum[i] + a[i][j]], u = m[a[i][j]];
        if (u != id && v[u].second == v[id].second) continue;
        g[u] = id;
      }
    }
  }
  long long timer = 0;
  vector<long long> dp(1 << k, 0), par(1 << k, 0), head(1 << k, -1);
  vector<long long> vis(v.size() + 5, 0);
  for (long long i = 0; i < k; ++i) {
    for (auto j : a[i]) {
      long long mask = 0, u = m[j];
      ++timer;
      if (vis[u] || g[u] == -1) continue;
      while (~u && !vis[u]) {
        vis[u] = timer;
        u = g[u];
      }
      if (u == -1 || vis[u] != timer) continue;
      long long c = 0, x = u, good = 1;
      while (x != u || !c) {
        if ((mask >> v[x].second) & 1) good = 0;
        mask |= (1 << v[x].second);
        x = g[x];
        ++c;
      }
      if (good) {
        dp[mask] = 1;
        head[mask] = u;
      }
    }
  }
  dp[0] = 1;
  for (long long i = 0; i < (1 << k); ++i) {
    for (long long s = i; s; s = (s - 1) & i) {
      if (dp[s] && dp[i ^ s]) {
        dp[i] = 1;
        par[i] = s;
      }
    }
  }
  if (!dp[(1 << k) - 1]) {
    cout << "No\n";
    return 0;
  }
  vector<pair<long long, long long>> ans(k);
  function<void(long long)> getans = [&](long long mask) {
    if (~head[mask]) {
      long long u = head[mask], x = g[u];
      ans[v[x].second].first = v[x].first;
      ans[v[x].second].second = v[u].second + 1;
      while (u != x) {
        ans[v[g[x]].second].first = v[g[x]].first;
        ans[v[g[x]].second].second = v[x].second + 1;
        x = g[x];
      }
    } else {
      getans(par[mask]);
      getans(mask ^ par[mask]);
    }
  };
  getans((1 << k) - 1);
  cout << "Yes\n";
  for (long long i = 0; i < k; ++i)
    cout << ans[i].first << " " << ans[i].second << '\n';
}
