#include <stdio.h>
#include <stdlib.h>

#define WHITE 0
#define GRAY 1
#define BLACK 2

typedef struct _Vertex *Vertex;
struct _Vertex{
  //int i;
  //int j;
  Vertex *OUT;
  int in_deg;
  int out_deg;
  int cap;
  int col;
};


int DFS(Vertex v){
  int k;
  v->col = GRAY;
  for(k=0;k<v->out_deg;k++){
    Vertex u = v->OUT[k];
    int feasible;
    if(u->col == WHITE){
      feasible = DFS(u);
      if(feasible==0)
	return 0;
    }
    else if(u->col == GRAY)
      return 0;
  }
  v->col = BLACK;
  return 1;
}


int main(){
  Vertex **V;
  int N,N1;
  int **A,i,j;
  // read input
  scanf("%d",&N);
  N1 = N-1;
  A = (int**)malloc(N*sizeof(int*));
  for(i=0;i<N;i++){
    A[i] = (int*)malloc((N-1)*sizeof(int));
    for(j=0;j<N1;j++){
      scanf("%d",&A[i][j]);
      A[i][j]--;
    }
  }

  // construct directed graph
  V = (Vertex**)malloc(N*sizeof(Vertex*));
  for(i=0;i<N;i++){
    V[i] = (Vertex*)malloc((N-1-i)*sizeof(Vertex));
    for(j=0;j<N-1-i;j++){
	V[i][j] = (Vertex)malloc(sizeof(struct _Vertex));
	//V[i][j]->i = i;
	//V[i][j]->j = j;
	V[i][j]->in_deg = 0;
	V[i][j]->out_deg = 0;
	V[i][j]->cap = 10;
	V[i][j]->OUT = (Vertex*)malloc(V[i][j]->cap*sizeof(Vertex));
      }
  }

  for(i=0;i<N;i++)
    for(j=1;j<N1;j++){
      int p,q,x,y,a,b;
      p = A[i][j-1];
      q = A[i][j];
      x=i; y=q;
      if(x>y){
	x=q; y=i;
      }
      a=i; b=p;
      if(a>b){
	a=p; b=i;
      }
      //printf("%d %d %d %d %d %d %d %d \n",i,j,p,q,x,y,a,b);
      y = y-x-1;
      b = b-a-1;
      //printf("%d %d %d %d %d %d %d %d \n",i,j,p,q,x,y,a,b);
      V[x][y]->in_deg++;
      V[a][b]->OUT[V[a][b]->out_deg] = V[x][y];
      V[a][b]->out_deg++;
      if(V[a][b]->out_deg == V[a][b]->cap){
	V[a][b]->cap *= 2;
	V[a][b]->OUT = (Vertex*)realloc(V[a][b]->OUT, V[a][b]->cap*sizeof(Vertex));
      }
      V[a][b]->col = WHITE;
    }

 
  for(i=0;i<N;i++)
    free(A[i]);
  free(A);
    
  /*
  for(i=0;i<N;i++)
    for(j=i+1;j<N;j++){
      int k;
      printf("(%d,%d)--->",i,j);
      for(k=0;k<V[i][j]->out_deg;k++)
	printf("(%d,%d)",V[i][j]->OUT[k]->i,V[i][j]->OUT[k]->j);
      printf("\n");
    }
  */
   for(i=0;i<N;i++)
    for(j=0;j<N-1-i;j++)
      if(V[i][j]->col == WHITE)
	if(DFS(V[i][j])==0){
	  printf("-1\n");
	  return 0;
	}

#if 0
   Vertex *R;
   int days=0;
   R = (Vertex*)malloc(N*sizeof(Vertex));

   while(1){
     int k,d,r = 0;
     for(i=0;i<N;i++)
       for(j=1;j<N;j++){
	 if(V[i][j]->in_deg==0 && V[i][j]->out_deg!=-1){
	   R[r] = V[i][j];
	   r++;
	 }
       }
     if(r==0)
       break;
     for(k=0;k<r;k++){
       for(d=0;d<R[k]->out_deg;d++)
	 R[k]->OUT[d]->in_deg--;
       R[k]->out_deg = -1;
     }
     days++;
   }
#else

   Vertex *Q,*R,*X,*Y;
   int days=1,r=0;
   Q = (Vertex*)malloc(N*sizeof(Vertex));
   R = (Vertex*)malloc(N*sizeof(Vertex));

   for(i=0;i<N;i++)
     for(j=0;j<N-1-i;j++){
       if(V[i][j]->in_deg==0 && V[i][j]->out_deg!=-1){
	 Q[r] = V[i][j];
	 r++;
       }
     }

   while(1){
     int k,d,s=0;
     if(days%2==1){
       X = Q; Y = R;
     }
     else{
       X = R; Y = Q;
     }
     for(k=0;k<r;k++){
       for(d=0;d<X[k]->out_deg;d++){
	 X[k]->OUT[d]->in_deg--;
	 if(X[k]->OUT[d]->in_deg==0){
	   Y[s] = X[k]->OUT[d];
	   s++;
	 }
       }
     }
     r = s;
     if(r==0)
       break;
     days++;
   }
#endif
   
   printf("%d\n",days);
   return 0;
}


Measured memory_bytes: 70528