import sys

sys.setrecursionlimit(2147483647)

INF=float("inf")

MOD=10**9+7

input=lambda:sys.stdin.readline().rstrip()

def resolve():

    n=int(eval(input()))



    # id table

    N=0

    id=[[None]*n for _ in range(n)]

    from itertools import product

    for i,j in product(list(range(n)),repeat=2):

        if(i>=j): continue

        id[i][j]=N

        N+=1

    toID=lambda i,j:id[min(i,j)][max(i,j)]



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

    for i in range(n):

        A=list([int(x)-1 for x in input().split()])

        for j in range(n-2):

            u=toID(i,A[j])

            v=toID(i,A[j+1])

            E[u].append(v)



    # longest path problem

    dp=[-1]*N

    def dfs(v):

        if(dp[v]>=0): return dp[v]

        dp[v]=-2

        res=0

        for nv in E[v]:

            if(dp[nv]==-2):

                print((-1))

                exit()

            elif(dp[nv]==-1):

                res=max(res,dfs(nv)+1)

            else:

                res=max(res,dp[nv]+1)

        dp[v]=res

        return res



    print((max(dfs(v) for v in range(N))+1))

resolve()
import sys

sys.setrecursionlimit(2147483647)

INF=float("inf")

MOD=10**9+7

input=lambda:sys.stdin.readline().rstrip()

def resolve():

    n=int(eval(input()))

    M=[None]*n

    for i in range(n):

        M[i]=list([int(x)-1 for x in input().split()])[::-1]



    # i が誰かしらと対戦できるか

    def check(i):

        if(not M[i]): # 既に試合を終えている

            return False

        j=M[i][-1]

        if(not M[j]): # これは起こり得ない

            return False

        return i==M[j][-1]



    # 初日に対戦できる人をピックアップ

    # 重複が起こるが、後で unique を取る

    Q=[]

    for i in range(n):

        if(check(i)):

            j=M[i][-1]

            if(i>j): i,j=j,i # i<j

            Q.append((i,j))



    # 処理を行なっていく

    day=0

    nQ=[] # 次の試合相手

    while(Q):

        # Q には重複があるので unique

        Q=list(set(Q))

        # 先に全ての試合を終わらせる必要がある

        for i,j in Q:

            M[i].pop(); M[j].pop()

        # 試合を終えた人は次の試合を行える可能性がある

        for i,j in Q:

            if(check(i)):

                k=M[i][-1]

                nQ.append((min(i,k),max(i,k)))

            if(check(j)):

                k=M[j][-1]

                nQ.append((min(j,k),max(j,k)))

        Q,nQ=nQ,[]

        day+=1



    print((day if(all(M[i]==[] for i in range(n))) else "-1"))

resolve()
import sys

sys.setrecursionlimit(2147483647)
INF = float("inf")
MOD = 10**9 + 7
input = lambda: sys.stdin.readline().rstrip()


def resolve():
    n = int(eval(input()))
    # id table
    N = 0
    id = [[None] * n for _ in range(n)]
    from itertools import product

    for i, j in product(list(range(n)), repeat=2):
        if i >= j:
            continue
        id[i][j] = N
        N += 1
    toID = lambda i, j: id[min(i, j)][max(i, j)]
    E = [[] for _ in range(N)]
    for i in range(n):
        A = list([int(x) - 1 for x in input().split()])
        for j in range(n - 2):
            u = toID(i, A[j])
            v = toID(i, A[j + 1])
            E[u].append(v)
    # longest path problem
    dp = [-1] * N

    def dfs(v):
        if dp[v] >= 0:
            return dp[v]
        dp[v] = -2
        res = 0
        for nv in E[v]:
            if dp[nv] == -2:
                print((-1))
                exit()
            elif dp[nv] == -1:
                res = max(res, dfs(nv) + 1)
            else:
                res = max(res, dp[nv] + 1)
        dp[v] = res
        return res

    print((max(dfs(v) for v in range(N)) + 1))


resolve()

import sys

sys.setrecursionlimit(2147483647)
INF = float("inf")
MOD = 10**9 + 7
input = lambda: sys.stdin.readline().rstrip()


def resolve():
    n = int(eval(input()))
    M = [None] * n
    for i in range(n):
        M[i] = list([int(x) - 1 for x in input().split()])[::-1]
    # i が誰かしらと対戦できるか
    def check(i):
        if not M[i]:  # 既に試合を終えている
            return False
        j = M[i][-1]
        if not M[j]:  # これは起こり得ない
            return False
        return i == M[j][-1]

    # 初日に対戦できる人をピックアップ
    # 重複が起こるが、後で unique を取る
    Q = []
    for i in range(n):
        if check(i):
            j = M[i][-1]
            if i > j:
                i, j = j, i  # i<j
            Q.append((i, j))
    # 処理を行なっていく
    day = 0
    nQ = []  # 次の試合相手
    while Q:
        # Q には重複があるので unique
        Q = list(set(Q))
        # 先に全ての試合を終わらせる必要がある
        for i, j in Q:
            M[i].pop()
            M[j].pop()
        # 試合を終えた人は次の試合を行える可能性がある
        for i, j in Q:
            if check(i):
                k = M[i][-1]
                nQ.append((min(i, k), max(i, k)))
            if check(j):
                k = M[j][-1]
                nQ.append((min(j, k), max(j, k)))
        Q, nQ = nQ, []
        day += 1
    print((day if (all(M[i] == [] for i in range(n))) else "-1"))


resolve()

-    # id table -    N = 0 -    id = [[None] * n for _ in range(n)] -    from itertools import product +    M = [None] * n +    for i in range(n): +        M[i] = list([int(x) - 1 for x in input().split()])[::-1] +    # i が誰かしらと対戦できるか +    def check(i): +        if not M[i]:  # 既に試合を終えている +            return False +        j = M[i][-1] +        if not M[j]:  # これは起こり得ない +            return False +        return i == M[j][-1] -    for i, j in product(list(range(n)), repeat=2): -        if i >= j: -            continue -        id[i][j] = N -        N += 1 -    toID = lambda i, j: id[min(i, j)][max(i, j)] -    E = [[] for _ in range(N)] +    # 初日に対戦できる人をピックアップ +    # 重複が起こるが、後で unique を取る +    Q = [] -        A = list([int(x) - 1 for x in input().split()]) -        for j in range(n - 2): -            u = toID(i, A[j]) -            v = toID(i, A[j + 1]) -            E[u].append(v) -    # longest path problem -    dp = [-1] * N - -    def dfs(v): -        if dp[v] >= 0: -            return dp[v] -        dp[v] = -2 -        res = 0 -        for nv in E[v]: -            if dp[nv] == -2: -                print((-1)) -                exit() -            elif dp[nv] == -1: -                res = max(res, dfs(nv) + 1) -            else: -                res = max(res, dp[nv] + 1) -        dp[v] = res -        return res - -    print((max(dfs(v) for v in range(N)) + 1)) +        if check(i): +            j = M[i][-1] +            if i > j: +                i, j = j, i  # i<j +            Q.append((i, j)) +    # 処理を行なっていく +    day = 0 +    nQ = []  # 次の試合相手 +    while Q: +        # Q には重複があるので unique +        Q = list(set(Q)) +        # 先に全ての試合を終わらせる必要がある +        for i, j in Q: +            M[i].pop() +            M[j].pop() +        # 試合を終えた人は次の試合を行える可能性がある +        for i, j in Q: +            if check(i): +                k = M[i][-1] +                nQ.append((min(i, k), max(i, k))) +            if check(j): +                k = M[j][-1] +                nQ.append((min(j, k), max(j, k))) +        Q, nQ = nQ, [] +        day += 1 +    print((day if (all(M[i] == [] for i in range(n))) else "-1"))