import std.algorithm;
import std.array;
import std.container;
import std.conv;
import std.math;
import std.numeric;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

void scan(T...)(ref T a) {
    string[] ss = readln.split;
    foreach (i, t; T) a[i] = ss[i].to!t;
}
T read(T)() { return readln.chomp.to!T; }
T[] reads(T)() { return readln.split.to!(T[]); }
alias readint = read!int;
alias readints = reads!int;

// 試合するペア
alias P = Tuple!(int, int);

int calc(int[][] g) {
    int n = cast(int)g.length;

    // 後ろから popBack するので reverse しておく
    foreach (i; 0..n) g[i].reverse();

    // 対戦可能な試合を v に格納
    void putGame(int i, ref P[] v) {
        if (g[i].length == 0) return;
        int j = g[i][$-1];
        if (g[j].back == i) {
            v ~= P(min(i, j), max(i, j));
        }
    }

    P[] v;
    foreach (i; 0..n) putGame(i, v);

    int day = 0;
    while (v.length > 0) {
        day++;
        v.sort;
        v = v.uniq.array;

        P[] prevV;
        swap(prevV, v);

        foreach (x; prevV) {
            g[x[0]].popBack();
            g[x[1]].popBack();
        }
        foreach (x; prevV) {
            putGame(x[0], v);
            putGame(x[1], v);
        }
    }
    foreach (i; 0..n) {
        if (g[i].length > 0) return -1;
    }
    return day;
}

void main() {
    int n; scan(n);
    int[][] g;
    for (int i = 0; i < n; i++) {
        g ~= readints.map!(e => e - 1).array;
    }
    writeln(calc(g));
}
