#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:1108864220")
using namespace std;
const int MOD = 1000000007;
const int INF = 1000000000;
const double EPS = 1e-9;
const int HASH_POW = 29;
const long double PI = acos(-1.0);
mt19937_64 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
long long nextLong(long long l, long long r) {
  uniform_int_distribution<long long> foo(l, r);
  return foo(rnd);
}
double nextDouble(double l, double r) {
  uniform_real_distribution<double> foo(l, r);
  return foo(rnd);
}
double workTime() { return double(clock()) / CLOCKS_PER_SEC; }
void myReturn(int code = 0) { exit(code); }
int n;
long long goal = 0;
vector<int> p[15];
vector<long long> sum;
unordered_map<int, pair<int, int> > pos;
pair<int, int> cycles[1 << 15];
bool dp[1 << 15];
int par[1 << 15];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  scanf("%d", &n);
  sum.resize(n);
  for (int i = 0; i < n; ++i) {
    int s;
    scanf("%d", &s);
    p[i].resize(s);
    sum[i] = 0;
    for (int j = 0; j < s; ++j) {
      scanf("%d", &p[i][j]);
      goal += p[i][j];
      sum[i] += p[i][j];
      pos[p[i][j]] = {i, j};
    }
  }
  if (goal % n != 0) {
    printf("No\n");
    myReturn();
  } else {
    goal /= n;
  }
  for (int i = 0; i < (1 << n); ++i) {
    cycles[i] = {-1, -1};
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < p[i].size(); ++j) {
      int msk = 0, row = i, col = j;
      bool good = true;
      while (true) {
        if (msk & (1 << row)) {
          if (row != i) {
            good = false;
          } else if (col != j) {
            good = false;
          }
          break;
        }
        msk |= (1 << row);
        long long val = goal - sum[row] + p[row][col];
        if (abs(val) > 1000000000) {
          good = false;
          break;
        }
        int key = (int)val;
        if (pos.find(key) == pos.end()) {
          good = false;
          break;
        }
        if (pos[key].first == row && pos[key].second != col) {
          good = false;
          break;
        }
        row = pos[key].first, col = pos[key].second;
      }
      if (good) {
        cycles[msk] = {i, j};
      }
    }
  }
  dp[0] = true;
  for (int i = 1; i < (1 << n); ++i) {
    for (int s = i; s > 0; s = ((s - 1) & i)) {
      if (cycles[s].first != -1 && dp[i ^ s]) {
        dp[i] = true;
        par[i] = s;
      }
    }
  }
  if (!dp[(1 << n) - 1]) {
    printf("No\n");
    myReturn();
  }
  vector<pair<int, int> > ans(n, {-1, -1});
  int q = (1 << n) - 1;
  while (q != 0) {
    int s = par[q];
    q ^= s;
    int msk = 0, row = cycles[s].first, col = cycles[s].second;
    while (true) {
      if (msk & (1 << row)) {
        break;
      }
      msk |= (1 << row);
      long long val = goal - sum[row] + p[row][col];
      int key = (int)val;
      ans[pos[key].first] = {p[pos[key].first][pos[key].second], row + 1};
      row = pos[key].first, col = pos[key].second;
    }
  }
  printf("Yes\n");
  for (int i = 0; i < n; ++i) {
    printf("%d %d\n", ans[i].first, ans[i].second);
  }
  myReturn();
}
