import java.math.BigInteger;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class medals_b3_tl0 {
  public static final void main( String[] args ) throws FileNotFoundException {
    Scanner in = new Scanner(new File("medals.in"));
    PrintWriter out = new PrintWriter("medals.out");

    int n = in.nextInt(), m = 0;
    int[][] a = new int[n][];
    int[][] b = new int[n][];
    for (int i = 0; i < n; i++) {
      int k = in.nextInt();
      a[i] = new int[k];
      b[i] = new int[k];
      for (int j = 0; j < k; j++) {
        a[i][j] = in.nextInt() - 1;
        b[i][j] = in.nextInt();
        m = Math.max(m, a[i][j] + 1);
      }
    }

    int N = n + m + 2;
    int s = 0, t = n + m + 1;
    ArrayList<ArrayList<Integer>> gt = new ArrayList<ArrayList<Integer>>(N);
    ArrayList<ArrayList<Integer>> gf = new ArrayList<ArrayList<Integer>>(N);
    ArrayList<ArrayList<Integer>> gc = new ArrayList<ArrayList<Integer>>(N);
    ArrayList<ArrayList<BigInteger>> gw = new ArrayList<ArrayList<BigInteger>>(N);
    ArrayList<ArrayList<Integer>> gr = new ArrayList<ArrayList<Integer>>(N);
    for (int i = 0; i < N; i++) {
      gt.add(new ArrayList<Integer>());
      gf.add(new ArrayList<Integer>());
      gc.add(new ArrayList<Integer>());
      gw.add(new ArrayList<BigInteger>());
      gr.add(new ArrayList<Integer>());
    }
    for (int i = 0; i < n; i++) {
      gr.get(0).add(gt.get(i + 1).size());
      gr.get(i + 1).add(gt.get(0).size());
      gt.get(0).add(i + 1);
      gf.get(0).add(0);
      gc.get(0).add(1);
      gw.get(0).add(BigInteger.ZERO);
      gt.get(i + 1).add(0);
      gf.get(i + 1).add(0);
      gc.get(i + 1).add(0);
      gw.get(i + 1).add(BigInteger.ZERO);
      for (int j = 0; j < a[i].length; j++) {
        int x = a[i][j] + 1 + n;
        BigInteger y = BigInteger.ONE;
        for (int k = b[i][j]; k < 10; k++)
          y = y.multiply(BigInteger.valueOf(1024));
        gr.get(i + 1).add(gt.get(x).size());
        gr.get(x).add(gt.get(i + 1).size());
        gt.get(i + 1).add(x);
        gf.get(i + 1).add(0);
        gc.get(i + 1).add(1);
        gw.get(i + 1).add(y.negate());
        gt.get(x).add(i + 1);
        gf.get(x).add(0);
        gc.get(x).add(0);
        gw.get(x).add(y);
      }
    }
    for (int i = 0; i < m; i++) {
      int x = i + n + 1;
      gr.get(x).add(gt.get(t).size());
      gr.get(t).add(gt.get(x).size());
      gt.get(x).add(t);
      gf.get(x).add(0);
      gc.get(x).add(1);
      gw.get(x).add(BigInteger.ZERO);
      gt.get(t).add(x);
      gf.get(t).add(0);
      gc.get(t).add(0);
      gw.get(t).add(BigInteger.ZERO);
    }

    BigInteger ans = BigInteger.ZERO;
    while (true) {
      int[] c = new int[N];
      int[] inq = new int[N];
      int[] p = new int[N];
      int[] pi = new int[N];
      int[] q = new int[N];
      int qs = 0, qz = 0;
      BigInteger[] d = new BigInteger[N];
      for (int i = 0; i < N; i++) {
        c[i] = 0;
        inq[i] = 0;
        p[i] = -1;
        pi[i] = -1;
        d[i] = null;
      }
      d[s] = BigInteger.ZERO;
      c[s] = inq[s] = 1;
      q[(qs + qz++) % N] = s;
      while (qz > 0) {
        int u = q[(qs++) % N];
        qz--;
        for (int i = 0; i < gt.get(u).size(); i++) {
          if (gf.get(u).get(i) >= gc.get(u).get(i))
            continue;
          int x = gt.get(u).get(i);
          BigInteger w = d[u].add(gw.get(u).get(i));
          if (c[x] == 1 && w.compareTo(d[x]) >= 0)
            continue;
          d[x] = w;
          p[x] = u;
          pi[x] = i;
          if (inq[x] != 0)
            continue;
          c[x] = 1;
          inq[x] = 1;
          q[(qs + qz++) % N] = x;
        }
      }
      if (c[t] == 0 || d[t].compareTo(BigInteger.ZERO) >= 0)
        break;
      ans = ans.subtract(d[t]);
      for (int u = t; p[u] != -1; u = p[u]) {
        gf.get(p[u]).set(pi[u], gf.get(p[u]).get(pi[u]) + 1);
        gf.get(u).set(gr.get(p[u]).get(pi[u]), gf.get(u).get(gr.get(p[u]).get(pi[u])) - 1);
      }
    }

    int[] ra = new int[10];
    for (int i = 9; i >= 0; i--) {
      ra[i] = ans.remainder(BigInteger.valueOf(1024)).intValue();
      ans = ans.divide(BigInteger.valueOf(1024));
    }
    int[] rb = new int[n];
    for (int i = 0; i < n; i++) {
      int x = i + 1;
      rb[i] = 0;
      for (int j = 0; j < gt.get(x).size(); j++) {
        if (gf.get(x).get(j) <= 0)
          continue;
        rb[i] = gt.get(x).get(j) - n;
      }
    }
    for (int i = 0; i < m; i++) {
      int x = i + 1 + n;
      for (int j = 0; j < gt.get(x).size(); j++) {
        if (gf.get(x).get(j) <= 0)
          continue;
      }
    }

    for (int i = 0; i < ra.length; i++) {
      if (i > 0)
        out.print(" ");
      out.print(ra[i]);
    }
    out.println();
    for (int i = 0; i < rb.length; i++) {
      if (i > 0)
        out.print(" ");
      out.print(rb[i]);
    }
    out.println();
    out.close();
  }
}

