#d maze master

from collections import deque

def bfs(sx,sy):
    cnt=0
    INF=100100100
    #mazeのまわりを"#"で囲ったので
    dist=[[INF]*(w+2) for _ in range(h+2)]
    dx=[1,0,-1,0]
    dy=[0,1,0,-1]

    que=deque([])
    que.append((sx,sy))
    dist[sx][sy]=0

    #while内でpopして空になったとき(最後の層)まで調べた
    while que:
        q=que.popleft()

        for i in range(4):
            next_x=q[0]+dx[i]
            next_y=q[1]+dy[i]

            if maze[next_x][next_y]!="#" and dist[next_x][next_y]==INF:
                que.append((next_x,next_y))
                dist[next_x][next_y]=dist[q[0]][q[1]]+1
                cnt=dist[next_x][next_y]
                #一番最後の層の距離に更新される
    return cnt

h,w=map(int,input().split())
maze=[]
ans=0
x=""
for i in range(w+2):
    x+="#"
maze.append(x)
for i in range(h):
    s=input()
    s='#'+s+'#'
    maze.append(s)
maze.append(x)
for i in range(1,h+1):
    for j in range(1,w+1):
        ans=max(ans,bfs(i,j))
print(ans)