N players will participate in a tennis tournament. We will call them Player 1, Player 2, \ldots, Player N.

The tournament is round-robin format, and there will be N(N-1)/2 matches in total. Is it possible to schedule these matches so that all of the following conditions are satisfied? If the answer is yes, also find the minimum number of days required.

* Each player plays at most one matches in a day.
* Each player i (1 \leq i \leq N) plays one match against Player A_{i, 1}, A_{i, 2}, \ldots, A_{i, N-1} in this order.

Constraints

* 3 \leq N \leq 1000
* 1 \leq A_{i, j} \leq N
* A_{i, j} \neq i
* A_{i, 1}, A_{i, 2}, \ldots, A_{i, N-1} are all different.

Input

Input is given from Standard Input in the following format:


N
A_{1, 1} A_{1, 2} \ldots A_{1, N-1}
A_{2, 1} A_{2, 2} \ldots A_{2, N-1}
:
A_{N, 1} A_{N, 2} \ldots A_{N, N-1}


Output

If it is possible to schedule all the matches so that all of the conditions are satisfied, print the minimum number of days required; if it is impossible, print `-1`.

Examples

Input

3
2 3
1 3
1 2


Output

3


Input

4
2 3 4
1 3 4
4 1 2
3 1 2


Output

4


Input

3
2 3
3 1
1 2


Output

-1

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class Main {
  private static void solve() {
    int n = ni();
    int[][] a = ntable(n, n - 1);
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n - 1; j++) {
        a[i][j]--;
      }
    }
    Map<Integer, Integer> map = new HashMap<>();
    int inf = 10000;
    int ptr = 0;
    for (int i = 0; i < n; i++) {
      for (int j = i + 1; j < n; j++) {
        map.put(i * inf + j, ptr);
        map.put(j * inf + i, ptr);
        ptr++;
      }
    }

    int[][] e = new int[n][n - 1];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n - 1; j++) {
        e[i][j] = map.get(i * inf + a[i][j]);
      }
    }

    int m = ptr;
    int[] from = new int[m * 2];
    int[] to = new int[m * 2];

    ptr = 0;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n - 2; j++) {
        from[ptr] = e[i][j];
        to[ptr] = e[i][j + 1];
        ptr++;
      }
    }
    from = Arrays.copyOf(from, ptr);
    to = Arrays.copyOf(to, ptr);
    int[][] g = packD(m, from, to);

    int[] v = sortTopologically(g);
    if (v == null) {
      System.out.println(-1);
      return;
    }

    int[] dp = new int[m];
    for (int i : v) {
      for (int nex : g[i]) {
        dp[nex] = Math.max(dp[nex], dp[i] + 1);
      }
    }

    System.out.println(Arrays.stream(dp).max().getAsInt() + 1);

  }

  public static int[] sortTopologically(int[][] g) {
    int n = g.length;
    int[] ec = new int[n];
    for (int i = 0; i < n; i++) {
      for (int to : g[i])
        ec[to]++;
    }
    int[] ret = new int[n];
    int q = 0;

    // sources
    for (int i = 0; i < n; i++) {
      if (ec[i] == 0)
        ret[q++] = i;
    }

    for (int p = 0; p < q; p++) {
      for (int to : g[ret[p]]) {
        if (--ec[to] == 0)
          ret[q++] = to;
      }
    }
    // loop
    for (int i = 0; i < n; i++) {
      if (ec[i] > 0)
        return null;
    }
    return ret;
  }

  static int[][] packD(int n, int[] from, int[] to) {
    int[][] g = new int[n][];
    int[] p = new int[n];
    for (int f : from)
      p[f]++;
    for (int i = 0; i < n; i++)
      g[i] = new int[p[i]];
    for (int i = 0; i < from.length; i++) {
      g[from[i]][--p[from[i]]] = to[i];
    }
    return g;
  }

  public static void main(String[] args) {
    new Thread(null, new Runnable() {
      @Override
      public void run() {
        long start = System.currentTimeMillis();
        String debug = args.length > 0 ? args[0] : null;
        if (debug != null) {
          try {
            is = java.nio.file.Files.newInputStream(java.nio.file.Paths.get(debug));
          } catch (Exception e) {
            throw new RuntimeException(e);
          }
        }
        reader = new java.io.BufferedReader(new java.io.InputStreamReader(is), 32768);
        solve();
        out.flush();
        tr((System.currentTimeMillis() - start) + "ms");
      }
    }, "", 64000000).start();
  }

  private static java.io.InputStream is = System.in;
  private static java.io.PrintWriter out = new java.io.PrintWriter(System.out);
  private static java.util.StringTokenizer tokenizer = null;
  private static java.io.BufferedReader reader;

  public static String next() {
    while (tokenizer == null || !tokenizer.hasMoreTokens()) {
      try {
        tokenizer = new java.util.StringTokenizer(reader.readLine());
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }
    return tokenizer.nextToken();
  }

  private static double nd() {
    return Double.parseDouble(next());
  }

  private static long nl() {
    return Long.parseLong(next());
  }

  private static int[] na(int n) {
    int[] a = new int[n];
    for (int i = 0; i < n; i++)
      a[i] = ni();
    return a;
  }

  private static char[] ns() {
    return next().toCharArray();
  }

  private static long[] nal(int n) {
    long[] a = new long[n];
    for (int i = 0; i < n; i++)
      a[i] = nl();
    return a;
  }

  private static int[][] ntable(int n, int m) {
    int[][] table = new int[n][m];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        table[i][j] = ni();
      }
    }
    return table;
  }

  private static int[][] nlist(int n, int m) {
    int[][] table = new int[m][n];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        table[j][i] = ni();
      }
    }
    return table;
  }

  private static int ni() {
    return Integer.parseInt(next());
  }

  private static void tr(Object... o) {
    if (is != System.in)
      System.out.println(java.util.Arrays.deepToString(o));
  }
}
