#include <bits/stdc++.h>
using namespace std;
template <class T>
ostream& operator<<(ostream& os, vector<T> V) {
  os << "[ ";
  for (auto v : V) os << v << " ";
  return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> V) {
  os << "[ ";
  for (auto v : V) os << v << " ";
  return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> P) {
  return os << "(" << P.first << "," << P.second << ")";
}
const int N = 5005;
const int K = 15;
const int M = 1 << K;
const int Z = N * K;
long long n, k, m;
long long num[Z], kaha[Z], col[K];
map<long long, long long> idx;
vector<int> adj[Z];
vector<vector<int> > cycles;
long long vis[Z], T, dn;
stack<int> st;
int exists[M];
vector<int> cycle[M];
int dp[M], bp[M];
set<int> chosen;
pair<long long, long long> ans[K];
void rec(int msk) {
  if (msk == 0) return;
  if (exists[msk]) {
    chosen.insert(msk);
    return;
  }
  int j = bp[msk];
  int j1 = j ^ msk;
  rec(j);
  rec(j1);
}
void go(int m) {
  int msk = m - 1;
  rec(msk);
  for (int i = 0; i < n; i++) ans[kaha[i]] = {num[i], kaha[i] + 1};
  for (int i : chosen) {
    vector<int>& z = cycle[i];
    for (int j = 0; j < z.size(); j++) {
      ans[kaha[z[j]]] = {num[z[j]],
                         kaha[z[(j - 1 + (int)z.size()) % z.size()]] + 1};
    }
  }
  for (int i = 0; i < k; i++)
    cout << ans[i].first << ' ' << ans[i].second << '\n';
}
void dfs(int u) {
  vis[u] = T;
  st.push(u);
  for (int v : adj[u]) {
    if (!dn && vis[v] == T) {
      vector<int> ne;
      while (1) {
        ne.push_back(st.top());
        if (st.top() == v) break;
        st.pop();
      }
      reverse(ne.begin(), ne.end());
      cycles.push_back(ne);
      dn = 1;
      break;
    }
    if (!vis[v]) dfs(v);
  }
  if (!dn) st.pop();
}
void find_cycles() {
  for (int i = 0; i < n; i++) {
    while (!st.empty()) st.pop();
    if (!vis[i]) T++, dn = 0, dfs(i);
  }
  for (auto& z : cycles) {
    int msk = 0;
    int shd = 1;
    for (auto i : z) {
      if (msk & (1 << kaha[i])) shd = 0;
      msk |= (1 << kaha[i]);
    }
    if (!shd) continue;
    exists[msk] = 1;
    dp[msk] = 1;
    cycle[msk] = z;
  }
  for (int i = 0; i < (1 << k); i++) {
    for (int j = i; j; j = (j - 1) & i) {
      int j1 = j ^ i;
      if (dp[j1] && dp[j]) {
        dp[i] = 1;
        bp[i] = j;
        break;
      }
    }
  }
  m = 1 << k;
  if (!dp[m - 1]) exit(puts("No"));
  cout << "Yes\n";
  go(m);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout << setprecision(25);
  long long a, b, c, d;
  cin >> k;
  b = 0;
  long long sum = 0;
  for (long long i = 0; i < k; i++) {
    cin >> n;
    while (n--) {
      cin >> a;
      idx[a] = b;
      num[b] = a;
      kaha[b++] = i;
      sum += a;
      col[i] += a;
    }
  }
  if (sum % k != 0) exit(puts("No\n"));
  sum /= k;
  n = b;
  for (long long i = 0; i < n; i++) {
    long long y = sum - col[kaha[i]] + num[i];
    if (idx.find(y) == idx.end()) continue;
    adj[i].push_back(idx[y]);
  }
  find_cycles();
}
