from collections import deque
INF = 20 * 20 + 1

def main():
    H, W = map(int, input().split())
    maze = [list(input()) for _ in range(H)]
    
    ans = 0
    for hs in range(H):
        for ws in range(W):
            if maze[hs][ws] == '#':
                continue
            goal_dists = [[-1 for _ in range(W+2)] for _ in range(H)]
            goal_dists = [[-1 for _ in range(W+2)]] + goal_dists + [[-1 for _ in range(W+2)]]
            for h in range(H):
                for w in range(W):
                    if maze[h][w] == '#':
                        goal_dists[h+1][w+1] = -1
                    else:
                        goal_dists[h+1][w+1] = INF
            goal_dists[hs+1][ws+1] = 0
            d = deque([[hs+1, ws+1]])
            while len(d) > 0:
                ht, wt = d.popleft()
                dist = goal_dists[ht][wt]
                for dh, dw in [[0, 1], [0, -1], [1, 0], [-1, 0]]:
                    if goal_dists[ht+dh][wt+dw] == -1:
                        continue
                    if goal_dists[ht+dh][wt+dw] > dist:
                        goal_dists[ht+dh][wt+dw] = dist + 1
                        d.append([ht+dh, wt+dw])
            
            max_dist = 0
            for h in range(1, H+2):
                for w in range(1, W+2):
                    if goal_dists[h][w] == INF:
                        continue
                    max_dist = max(max_dist, goal_dists[h][w])
            ans = max(ans, max_dist)
    
    print(ans)

if __name__ == "__main__":
    main()