H,W=map(int,input().split())
S=[]
for _ in range(H):
    s=input()
    ss=[a for a in s]
    S.append(ss)
answers=[]
start=[]
for h,c_h in enumerate(S):
    for w,c_w in enumerate(c_h):
        if c_w=='.':
            start.append([h,w])
if len(start)==0:
    print(0)
else:
    for a in start:
        stack=[]
        stack.append(a)
        visited_area=[[0 for _ in range(W)] for _ in range(H)]
        def bfs(S,visited_area,stack):
            while len(stack)>0:
                h,w=stack.pop()
                for x,y in ([1,0],[-1,0],[0,1],[0,-1]):
                    new_h=h+x
                    new_w=w+y
                    if new_h<0 or new_h>=H or new_w<0 or new_w>=W:
                        continue
                    if S[new_h][new_w]=='.' and visited_area[new_h][new_w]==0:
                        visited_area[new_h][new_w]=visited_area[h][w]+1
                        stack.insert(0,[new_h,new_w])
            kotae=[]
            for z in range(H):
                saidai=max(visited_area[z])
                kotae.append(saidai)
            large=max(kotae)
            answers.append(large)
        bfs(S, visited_area, stack)
    print(max(answers))
    