source_code: import java.lang.*;
  import java.util.*;
  import java.io.*;
  
  public class Main {
      void solve() {
          int m=ni();
          long a[][]=new long[m][];
          HashMap<Long,Integer> mp=new HashMap<>();
          long TS=0;
          long sm[]=new long[m];
          for(int i=0;i<m;i++){
              int sz=ni();
              a[i]=new long[sz];
              for(int j=0;j<sz;j++){
                  a[i][j]=nl();
                  mp.put(a[i][j],i);
                  sm[i]+=a[i][j];
              }
              TS+=sm[i];
          }
          if(TS%m!=0){
              pw.println("No");
              return;
          }
          TS/=m;
          ArrayList<Node> ansForMask[]=new ArrayList[(1<<m)];
          for(int i=0;i<(1<<m);i++) ansForMask[i]=new ArrayList<>();
          ArrayList<Node> tempList=new ArrayList<>();
          int vis[]=new int[m];
          for(int i=0;i<m;i++){
              out:for(int j=0;j<a[i].length;j++){
                  int mask=0;
                  tempList.clear();
                  long val=a[i][j],req=Long.MAX_VALUE;
                  int idx=i,idx2;
                  Arrays.fill(vis,0);
                  if(sm[i]==TS){
                      mask=1<<i;
                      if(ansForMask[mask].size()==0) ansForMask[mask].add(new Node(val,i,i));
                      continue;
                  }
                  while(vis[idx]==0){
                      req=TS-(sm[idx]-val);
                      if(!mp.containsKey(req)) continue out;
                      idx2=mp.get(req);
                      if(vis[idx]==1 || idx==idx2) continue out;
                      if(vis[idx2]==1) break;
                  //   if(i==0 && j==1) pw.println(idx2+" "+req+" "+val);
                      vis[idx]=1;
                      mask+=(1<<idx);
                      tempList.add(new Node(req,idx2,idx));
                      idx=idx2;
                      val=req;
  
  
                  }
                  if(req!=a[i][j])continue out;
                  mask+=(1<<idx);
                  tempList.add(new Node(a[i][j],i,idx));
                  if(ansForMask[mask].size()==0){
                    // pw.println(Integer.toBinaryString(mask));
                      ansForMask[mask].addAll(tempList);
                  }
              }
          }
          int dp[]=new int[1<<m];
          dp[0]=1;
         out: for(int mask=1;mask <(1<<m);mask++){
              if(ansForMask[mask].size()!=0){
                  dp[mask]=1;
                 // pw.println(Integer.toBinaryString(mask)+" "+mask);
                  continue;
              }
              for(int s=mask;s>0;s=(s-1)&mask){
                  if(dp[s]==1 && dp[mask^s]==1){
                      dp[mask]=1;
                      ansForMask[mask].addAll(ansForMask[s]);
                      ansForMask[mask].addAll(ansForMask[mask^s]);
                      continue out;
  
                  }
              }
          }
          if(dp[(1<<m)-1]==0){
             pw.println("No");
             return;
          }
          pw.println("Yes");
          Pair ans[]=new Pair[m];
          for(Node p : ansForMask[(1<<m)-1]){
              ans[p.id1]=new Pair(p.c,p.id2);
          }
          for(int i=0;i<m;i++) pw.println(ans[i].c+" "+(ans[i].p+1));
  
  
  
      }
      class Pair {
          long c;
          int p;
          public Pair(long c,int p){
              this.c=c;
              this.p=p;
          }
      }
      class Node{
          long c;
          int id1;
          int id2;
          public Node(long c,int id1,int id2){
              this.c=c;
              this.id1=id1;
              this.id2=id2;
          }
      }
      long M = (long)1e9+7;
      // END
      PrintWriter pw;
      StringTokenizer st;
      BufferedReader br;
  
      void run() throws Exception {
          br = new BufferedReader(new InputStreamReader(System.in));
          pw = new PrintWriter(System.out);
          long s = System.currentTimeMillis();
          solve();
          pw.flush();
      }
      public static void main(String[] args) throws Exception {
          new Main().run();
      }
  
      String ns() {
          while (st == null || !st.hasMoreElements()) {
  
              try {
                  st = new StringTokenizer(br.readLine());
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          return st.nextToken();
      }
  
      String nextLine() throws Exception {
          String str = "";
          try {
              str = br.readLine();
          } catch (IOException e) {
              throw new Exception(e.toString());
          }
          return str;
      }
  
      int ni() {
          return Integer.parseInt(ns());
      }
  
      long nl() {
          return Long.parseLong(ns());
      }
  
      double nd() {
          return Double.parseDouble(ns());
      }
  }