//
//  ROIGold.cpp
//  Main calisma
//
//  Created by Rakhman on 05/02/2019.
//  Copyright © 2019 Rakhman. All rights reserved.
//

#include <cstring>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <queue>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cassert>
#include <iterator>

#define ios ios_base::sync_with_stdio(0), cout.tie(0), cin.tie(0);
#define S second
#define F first
#define pb push_back
#define nl '\n'
#define NL cout << '\n';
#define EX exit(0)
#define all(s) s.begin(), s.end()
#define FOR(i, start, finish, k) for(int i = start; i <= finish; i += k)

const int MXN = 1002;
const long long MNN = 2e3 + 200;
const long long MOD = 1e9 + 7;
const long long INF = 1e18;
const int OO = 1e9 + 500;

typedef long long llong;
typedef unsigned long long ullong;

using namespace std;

int n;
queue<int> q[MXN];
bool used[MXN];
vector<int> ch;

int main () {
    ios;
    cin >> n;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j < n; j++){
            int x;
            cin >> x;
            q[i].push(x);
        }
        ch.pb(i);
    }
    int i = 1;
    int num = n * (n - 1);
    for(i = 1; ; i++){
        vector<int> nw;
        for(int j = 0; j < ch.size(); j++){
            int t = ch[j];
            if(q[t].size() == 0) continue;
            int x = q[t].front();
            if(q[x].size() == 0) continue;
            int y = q[x].front();
            if(t == y && used[t] == 0 &&  used[x] == 0){
                num -= 2;
                used[t] = used[x] = 1;
                nw.pb(t);
                nw.pb(x);
                q[t].pop();
                q[x].pop();
            }
        }
        ch.clear();
        for(int j = 0; j < nw.size(); j++){
            used[nw[j]] = 0;
        }
        ch = nw;
        if(num == 0) break;
        if(nw.size() == 0) return cout << -1, 0;
    }
    cout << i;
    return 0;
}

/*
 5
 1 1 1 1 4
 1 1 0 1 4
 
 
 
 */
//void pihat(int ind){
//    if(ms.size() < msSize){
//        ms.insert(p[ind]);
//        ans += p[ind] * (x + y) / 100;
//    }else{
//        if(p[ind] > *ms.begin()){
//            ans -= (*ms.begin() * (x + y) / 100);
//            ms.erase(ms.begin());
//            ms.insert(p[ind]);
//            ans += (p[ind] * (x + y) / 100);
//        }else{
//            if(s1.size() < sz1){
//                s1.insert(p[ind]);
//                ans += p[ind] * x / 100;
//            }else{
//                if(p[ind] > *ms.begin()){
//                    ans -= (*s1.begin() * x / 100);
//                    s1.erase(s1.begin());
//                    s1.insert(p[ind]);
//                    ans += (p[ind] * x / 100);
//                }else{
//                    if(s2.size() < sz2){
//                        s2.insert(p[ind]);
//                        ans += p[ind] * y / 100;
//                    }else{
//                        if(p[ind] > *s2.begin()){
//                            ans -= (*s2.begin() * y / 100);
//                            s2.erase(s2.begin());
//                            s2.insert(p[ind]);
//                            ans += (p[ind] * y / 100);
//                        }
//                    }
//                }
//            }
//        }
//    }
//    if(ans >= k){
//        ok = 1;
//        cout << ms.size() + s1.size() + s2.size() << nl;
//    }
//}


Measured memory_bytes: 4736