### BUGGY CODE ###

#B-Graph Partition
n=int(input())
uselist=[[] for i in range(n+1)]
distancelist=[[10**5 for j in range(n)] for i in range(n)]
for i in range(n):
    s=input()
    for j in range(n):
        if int(s[j])!=0:
            distancelist[i][j]=1
            distancelist[j][i]=1
            uselist[i+1].append(j+1)
#各辺がどの点とつながっているかをuselistないに保存する
for i in range(n):
    distancelist[i][i]=0
visitedlist=[-1 for i in range(n)]
pointlist=[0 for j in range(n)]
flag=True
def search(i,string):
    visitedlist[i-1]=1
    if string==0:
        pointlist[i-1]="B"
    else:
        pointlist[i-1]=string
    flags=False 
    for node in uselist[i]:
        if visitedlist[node-1]==-1:
            #訪れていない点を発見した場合
            flags=True
            visitedlist[node-1]=1
            if string=="B"or string==0:
                pointlist[node-1]="R"
            elif string=="R":
                pointlist[node-1]="B"
        else:
            pass
    if flags:
        #一度でも訪れられた点がある時
        for j in uselist[i]:
            search(j,pointlist[j-1])
    if not flags:
        # 全ての点がすでにvisitedだった時
        pass    
search(1,0)
for j in range(1,n+1):
    for some in uselist[j]:
        if pointlist[j-1]==pointlist[some-1]:
            flag=False
if flag:
    #ワーシャルフロイド法で二点間の最小距離の最大値
    for k in range(n):
        for j in range(n):
            for i in range(n):
                distancelist[i][j]=min(distancelist[i][j],distancelist[i][k]+distancelist[k][j])
    maxi=0
    for i in range(n):
        for j in range(n):
            maxi=max(maxi,distancelist[i][j])
    print(maxi+1)
else:
    print(-1)

### FIXED CODE ###

#B-Graph Partition
n=int(input())
uselist=[[] for i in range(n+1)]
distancelist=[[10**5 for j in range(n)] for i in range(n)]
for i in range(n):
    s=input()
    for j in range(n):
        if int(s[j])!=0:
            distancelist[i][j]=1
            distancelist[j][i]=1
            uselist[i+1].append(j+1)
#各辺がどの点とつながっているかをuselistないに保存する
for i in range(n):
    distancelist[i][i]=0
visitedlist=[-1 for i in range(n)]
pointlist=[0 for j in range(n)]
flag=True
def search(i,string):
    visitedlist[i-1]=1
    if string==0:
        pointlist[i-1]="B"
    else:
        pointlist[i-1]=string
    flags=False 
    for node in uselist[i]:
        if visitedlist[node-1]==-1:
            #訪れていない点を発見した場合
            flags=True
            visitedlist[node-1]=1
            if string=="B"or string==0:
                pointlist[node-1]="R"
            elif string=="R":
                pointlist[node-1]="B"
        else:
            pass
    if flags:
        #一度でも訪れられた点がある時
        for j in uselist[i]:
            search(j,pointlist[j-1])
    if not flags:
        # 全ての点がすでにvisitedだった時
        pass    
search(1,0)
for j in range(1,n+1):
    for some in uselist[j]:
        if pointlist[j-1]==pointlist[some-1]:
            flag=False
if flag:
    #ワーシャルフロイド法で二点間の最小距離の最大値
    for k in range(n):
        for j in range(n):
            for i in range(n):
                distancelist[i][j]=min(distancelist[i][j],distancelist[i][k]+distancelist[k][j])
    maxi=0
    for i in range(n):
        for j in range(n):
            maxi=max(maxi,distancelist[i][j])
    print(maxi+1)
else:
    print(-1)