from collections import deque
import numpy as np

H,W = map(int,input().split())
maze = [input() for _ in range(H)]#迷路の入力

ans = 0
for x in range(H):#すべてのマスからスタート
    for y in range(W):
        #壁からはスタートできない：スルー
        if maze[x][y] == "#":
            continue

        #初期化：0埋め、HとWの順番に注意
        distance = [[0]*W for _ in range(H)]
        #start位置
        stack = deque([[x,y]])#デキューに入れる

        while stack:#スタックが有るあいだ
            h,w = stack.popleft()#スタックの先頭を取ってくる
            for i,j in [[1,0],[-1,0],[0,1],[0,-1]]:#マスの四方
                new_h, new_w = h+i, w+j#新しいマス
                if new_h < 0 or new_w < 0 or new_h >= H or new_w >= W:
                    continue#範囲外ならスルー
                elif maze[new_h][new_w] != "#" and distance[new_h][new_w] == 0:
                    distance[new_h][new_w] = distance[h][w]+1#BFS、+1
                    stack.append([new_h, new_w])
                    #新しいマスをスタックへ

        #start位置は0で初期化
        #distance[x][y] = 0
        ans = max(ans, np.max(distance))#npは二次元のmax取れる

print(ans)