#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 5, K = 17;
int k, c[K], a[K][N], bj, ans[K];
bool vis[1 << K], vv[K];
long long jb, sum, s[K];
map<int, int> mp;
vector<pair<int, int>> lp;
vector<pair<int, pair<int, int>>> ass;
void Dfs(int cur, int num, int id) {
  if (cur > bj || vv[cur]) return;
  vv[cur] = true;
  if (sum - s[cur] + num == jb) {
    lp.push_back(make_pair(id, num));
    return;
  }
  if (mp.find(sum - s[cur] + num) != mp.end()) {
    int nxt = mp[sum - s[cur] + num];
    Dfs(nxt, sum - s[cur] + num, id | (1 << nxt));
  }
}
void Print(int las, int cur) {
  int ned = sum - s[mp[cur]] + cur, nxt = mp[ned];
  ass.push_back(make_pair(nxt, make_pair(ned, mp[cur])));
  if (ned == las) return;
  Print(las, ned);
}
inline void Print(int cnt) {
  for (int i = 1; i <= cnt; ++i) Print(ans[i], ans[i]);
  sort(ass.begin(), ass.end());
  puts("Yes");
  for (const auto &p : ass)
    printf("%d %d\n", p.second.first, p.second.second + 1);
  exit(0);
}
void Dfs(int cur, int dep) {
  if (cur + 1 == (1 << k)) Print(dep);
  if (vis[cur]) return;
  vis[cur] = true;
  int res = (1 << k) - 1 - cur;
  for (const auto &p : lp) {
    if (p.first > res) break;
    if ((p.first | res) != res) continue;
    ans[dep + 1] = p.second;
    Dfs(cur | p.first, dep + 1);
  }
}
int main() {
  scanf("%d", &k);
  for (int i = 0; i < k; ++i) {
    scanf("%d", &c[i]);
    for (int j = 1; j <= c[i]; ++j) {
      scanf("%d", &a[i][j]);
      mp[a[i][j]] = i;
      sum += a[i][j];
      s[i] += a[i][j];
    }
  }
  if (sum % k != 0) return puts("No"), 0;
  sum /= k;
  for (int i = 0; i < k; ++i) {
    for (int j = 1; j <= c[i]; ++j) {
      memset(vv, false, sizeof(vv));
      jb = a[i][j], bj = i;
      Dfs(i, a[i][j], 1 << i);
    }
  }
  sort(lp.begin(), lp.end());
  Dfs(0, 0);
  puts("No");
  return 0;
}
