N=int(eval(input()))

A=[[] for _ in range(N)]



for i in range(N):

    A[i]=list(map(int,input().split()))



NE=[0]*N#i番目の人が，次何番目の試合をするかのリスト

F=[0]*N#i番目の人が，該当する日に試合をしたか記憶しておく



#i+1日目の試合をする人はi日目に試合をした人なので，それを2つのqueueに記憶．

Q=[[],[]]



#初日

for i in range(N):

    opp=A[i][0]-1

    if A[opp][0]-1==i:

        NE[i]+=1

        Q[0].append(i)



ans=1

#d日目

for d in range(N*(N-1)//2):

    F=[0]*N

    a=d%2

    b=(d+1)%2

    while len(Q[a])!=0:

        i=Q[a].pop()

        if NE[i]==N-1:

            continue

        opp=A[i][NE[i]]-1

        if F[i]==1 or F[opp]==1:#その日に試合したことがある人はスルー,oppの重複防止

            continue

        if A[opp][NE[opp]]-1==i:

            NE[i]+=1

            NE[opp]+=1

            F[i]=1

            F[opp]=1

            if NE[i]!=N-1:

                Q[b].append(i)

            if NE[opp]!=N-1:

                Q[b].append(opp)

    ans+=1

    if len(Q[a])==0 and len(Q[b])==0:

        break



for i in range(N):

    if NE[i]!=N-1:

        ans=-1

print(ans)
import sys

input = sys.stdin.readline



def I(): return int(eval(input()))

def MI(): return list(map(int, input().split()))

def LI(): return list(map(int, input().split()))



def main():

    mod=10**9+7

    N=I()

    A=[]

    inf=10**6

    for _ in range(N):

        a=LI()+[inf]

        for j in range(N-1):

            a[j]-=1

        A.append(a)

        

        

    cur=[0]*N#i番目の人が何試合消化したか

    

    st=[]# stackに，みるべき人を入れていいく，変化があった人だけ見れば良い

    nxt=[]

    

    #初日は全員みる，N>=3より初日で終わることはない

    for i in range(N):

        for j in range(i+1,N):

            if A[i][0]==j and A[j][0]==i:

                cur[i]=1

                cur[j]=1

                st.append(i)

                st.append(j)

    day=1

    

    while st:

        used=[0]*N

        day+=1

        

        while st:

            i=st.pop()#みる人

            j=A[i][cur[i]]#相手候補

            

            if used[i]==0 and used[j]==0:

                if A[j][cur[j]]==i:#マッチング

                    cur[i]+=1

                    cur[j]+=1

                    nxt.append(i)

                    nxt.append(j)

                    used[i]=1

                    used[j]=1

               

        while nxt:

            a=nxt.pop()

            if cur[a]!=N-1:

                st.append(a)

        

    if sum(cur)==N*(N-1):

        print(day)

    else:

        print((-1))

        

            

        

        

    



main()

N = int(eval(input()))
A = [[] for _ in range(N)]
for i in range(N):
    A[i] = list(map(int, input().split()))
NE = [0] * N  # i番目の人が，次何番目の試合をするかのリスト
F = [0] * N  # i番目の人が，該当する日に試合をしたか記憶しておく
# i+1日目の試合をする人はi日目に試合をした人なので，それを2つのqueueに記憶．
Q = [[], []]
# 初日
for i in range(N):
    opp = A[i][0] - 1
    if A[opp][0] - 1 == i:
        NE[i] += 1
        Q[0].append(i)
ans = 1
# d日目
for d in range(N * (N - 1) // 2):
    F = [0] * N
    a = d % 2
    b = (d + 1) % 2
    while len(Q[a]) != 0:
        i = Q[a].pop()
        if NE[i] == N - 1:
            continue
        opp = A[i][NE[i]] - 1
        if F[i] == 1 or F[opp] == 1:  # その日に試合したことがある人はスルー,oppの重複防止
            continue
        if A[opp][NE[opp]] - 1 == i:
            NE[i] += 1
            NE[opp] += 1
            F[i] = 1
            F[opp] = 1
            if NE[i] != N - 1:
                Q[b].append(i)
            if NE[opp] != N - 1:
                Q[b].append(opp)
    ans += 1
    if len(Q[a]) == 0 and len(Q[b]) == 0:
        break
for i in range(N):
    if NE[i] != N - 1:
        ans = -1
print(ans)

import sys

input = sys.stdin.readline


def I():
    return int(eval(input()))


def MI():
    return list(map(int, input().split()))


def LI():
    return list(map(int, input().split()))


def main():
    mod = 10**9 + 7
    N = I()
    A = []
    inf = 10**6
    for _ in range(N):
        a = LI() + [inf]
        for j in range(N - 1):
            a[j] -= 1
        A.append(a)
    cur = [0] * N  # i番目の人が何試合消化したか
    st = []  # stackに，みるべき人を入れていいく，変化があった人だけ見れば良い
    nxt = []
    # 初日は全員みる，N>=3より初日で終わることはない
    for i in range(N):
        for j in range(i + 1, N):
            if A[i][0] == j and A[j][0] == i:
                cur[i] = 1
                cur[j] = 1
                st.append(i)
                st.append(j)
    day = 1
    while st:
        used = [0] * N
        day += 1
        while st:
            i = st.pop()  # みる人
            j = A[i][cur[i]]  # 相手候補
            if used[i] == 0 and used[j] == 0:
                if A[j][cur[j]] == i:  # マッチング
                    cur[i] += 1
                    cur[j] += 1
                    nxt.append(i)
                    nxt.append(j)
                    used[i] = 1
                    used[j] = 1
        while nxt:
            a = nxt.pop()
            if cur[a] != N - 1:
                st.append(a)
    if sum(cur) == N * (N - 1):
        print(day)
    else:
        print((-1))


main()

-N = int(eval(input())) -A = [[] for _ in range(N)] -for i in range(N): -    A[i] = list(map(int, input().split())) -NE = [0] * N  # i番目の人が，次何番目の試合をするかのリスト -F = [0] * N  # i番目の人が，該当する日に試合をしたか記憶しておく -# i+1日目の試合をする人はi日目に試合をした人なので，それを2つのqueueに記憶． -Q = [[], []] -# 初日 -for i in range(N): -    opp = A[i][0] - 1 -    if A[opp][0] - 1 == i: -        NE[i] += 1 -        Q[0].append(i) -ans = 1 -# d日目 -for d in range(N * (N - 1) // 2): -    F = [0] * N -    a = d % 2 -    b = (d + 1) % 2 -    while len(Q[a]) != 0: -        i = Q[a].pop() -        if NE[i] == N - 1: -            continue -        opp = A[i][NE[i]] - 1 -        if F[i] == 1 or F[opp] == 1:  # その日に試合したことがある人はスルー,oppの重複防止 -            continue -        if A[opp][NE[opp]] - 1 == i: -            NE[i] += 1 -            NE[opp] += 1 -            F[i] = 1 -            F[opp] = 1 -            if NE[i] != N - 1: -                Q[b].append(i) -            if NE[opp] != N - 1: -                Q[b].append(opp) -    ans += 1 -    if len(Q[a]) == 0 and len(Q[b]) == 0: -        break -for i in range(N): -    if NE[i] != N - 1: -        ans = -1 -print(ans) +import sys + +input = sys.stdin.readline + + +def I(): +    return int(eval(input())) + + +def MI(): +    return list(map(int, input().split())) + + +def LI(): +    return list(map(int, input().split())) + + +def main(): +    mod = 10**9 + 7 +    N = I() +    A = [] +    inf = 10**6 +    for _ in range(N): +        a = LI() + [inf] +        for j in range(N - 1): +            a[j] -= 1 +        A.append(a) +    cur = [0] * N  # i番目の人が何試合消化したか +    st = []  # stackに，みるべき人を入れていいく，変化があった人だけ見れば良い +    nxt = [] +    # 初日は全員みる，N>=3より初日で終わることはない +    for i in range(N): +        for j in range(i + 1, N): +            if A[i][0] == j and A[j][0] == i: +                cur[i] = 1 +                cur[j] = 1 +                st.append(i) +                st.append(j) +    day = 1 +    while st: +        used = [0] * N +        day += 1 +        while st: +            i = st.pop()  # みる人 +            j = A[i][cur[i]]  # 相手候補 +            if used[i] == 0 and used[j] == 0: +                if A[j][cur[j]] == i:  # マッチング +                    cur[i] += 1 +                    cur[j] += 1 +                    nxt.append(i) +                    nxt.append(j) +                    used[i] = 1 +                    used[j] = 1 +        while nxt: +            a = nxt.pop() +            if cur[a] != N - 1: +                st.append(a) +    if sum(cur) == N * (N - 1): +        print(day) +    else: +        print((-1)) + + +main()