#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
const int inf = 1e9 + 10;
const long long INF = 1e18 + 10;
int n;
vector<long long> sum;
vector<long long> cnt, dp;
map<long long, long long> box, used;
vector<vector<long long> > a, cycle, cycle_ans;
map<long long, vector<long long> > g;
void get_path(int now) {
  if (cnt[now] != -1) {
    cycle_ans.push_back(cycle[cnt[now]]);
  } else {
    int from = dp[now];
    int x = from ^ now;
    get_path(x);
    get_path(from);
  }
}
vector<long long> path;
void dfs(long long v) {
  if (used[v] == 1) {
    long long x = v;
    vector<long long> way;
    while (path.back() != x) {
      way.push_back(path.back());
      path.pop_back();
    }
    way.push_back(path.back());
    path.pop_back();
    reverse(way.begin(), way.end());
    int mask = 0, bad = 0;
    for (auto i : way) {
      if ((mask & (1 << box[i]))) {
        bad = 1;
      }
      mask |= (1 << box[i]);
      used[i] = 2;
      path.push_back(i);
    }
    if (!bad) {
      cnt[mask] = cycle.size();
      cycle.push_back(way);
    }
  }
  if (used[v] == 2) {
    return;
  }
  used[v] = 1;
  path.push_back(v);
  for (auto to : g[v]) {
    dfs(to);
  }
  used[v] = 2;
  path.pop_back();
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  cin >> n;
  a.resize(n);
  sum.resize(n);
  for (int i = 0; i < n; i++) {
    int m;
    cin >> m;
    a[i].resize(m);
    for (int j = 0; j < m; j++) {
      cin >> a[i][j];
      sum[i] += a[i][j];
      box[a[i][j]] = i;
    }
  }
  long long sum_need = 0;
  for (int i = 0; i < n; i++) {
    sum_need += sum[i];
  }
  if (sum_need % n != 0) {
    return cout << "No\n", 0;
  }
  sum_need /= n;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < a[i].size(); j++) {
      int x = a[i][j];
      long long nxt = sum_need - sum[i] + x;
      if (box.find(nxt) != box.end()) {
        g[x].push_back(nxt);
      }
    }
  }
  cnt.resize(1 << n, -1);
  for (auto it : a) {
    for (auto v : it) {
      if (!used[v]) {
        dfs(v);
      }
    }
  }
  dp.resize(1 << n, -1);
  for (int i = 0; i < (1 << n); i++) {
    if (cnt[i] != -1) {
      dp[i] = i;
    }
  }
  for (int mask = 0; mask < (1 << n); mask++) {
    for (int submask = mask;; submask = (submask - 1) & mask) {
      int x = submask ^ mask;
      if (dp[x] != -1 && dp[mask ^ x] != -1) {
        dp[mask] = mask ^ x;
      }
      if (!submask) {
        break;
      }
    }
  }
  int now = dp[(1 << n) - 1];
  if (now == -1) {
    return cout << "No\n", 0;
  }
  now = (1 << n) - 1;
  get_path(now);
  cout << "Yes\n";
  vector<pair<long long, long long> > ans(n);
  for (auto it : cycle_ans) {
    int last = -inf;
    for (auto v : it) {
      if (last == -inf) {
        last = v;
      } else {
        ans[box[v]] = make_pair(v, box[last]);
        last = v;
      }
    }
    int v = it[0];
    ans[box[v]] = make_pair(v, box[last]);
  }
  for (auto i : ans) {
    cout << i.first << " " << i.second + 1 << "\n";
  }
  return 0;
}
