importsysinput=sys.stdin.readlinefromcollectionsimportdequedefbfs(x,y,name):queue=deque([(x,y)])visited=[[False]*Nfor_inrange(N)]visited[x][y]=1whilequeue:x,y=queue.popleft()foriinrange(4):nx=x+dx[i]ny=y+dy[i]if0<=nx<Nand0<=ny<N:ifnotvisited[nx][ny]andboard[x][y]==0andboard[nx][ny]!=nameandboard[nx][ny]>0:# 다른섬에 도착한 경우 멈춤
returnvisited[x][y]-1ifnotvisited[nx][ny]andboard[nx][ny]==0:visited[nx][ny]=visited[x][y]+1queue.append((nx,ny))returnvisited[x][y]-1deflabel(x,y,cnt):globalvisitedqueue=deque([(x,y)])board[x][y]=cntvisited[x][y]=Truewhilequeue:x,y=queue.popleft()foriinrange(4):nx=x+dx[i]ny=y+dy[i]if0<=nx<Nand0<=ny<N:ifnotvisited[nx][ny]andboard[nx][ny]==1:visited[nx][ny]=Trueboard[nx][ny]=cntqueue.append((nx,ny))if__name__=='__main__':N=int(input())board=[list(map(int,input().split()))for_inrange(N)]dx=[-1,1,0,0]dy=[0,0,-1,1]res=sys.maxsizevisited=[[False]*Nfor_inrange(N)]# 섬 라벨링
cnt=0forxinrange(N):foryinrange(N):ifboard[x][y]==1andnotvisited[x][y]:cnt+=1label(x,y,cnt)# 최소 0 체크
forxinrange(N):foryinrange(N):ifboard[x][y]>0:tmp=bfs(x,y,board[x][y])# x,y,섬라벨
iftmp>0:res=min(res,tmp)print(res)