"""
解法１：
startとgoalの組み合わせの全探索で調べる。
マス目の数は最大で400なので、組み合わせの数は最大で約160000.
各組み合わせごとにBFSで最短経路を調べるので、400回ループが必要。
なので計算時間としてはO(H^3W^3)

解法２：
ワーシャルフロイドで各ノードから各ノードへの最短経路を求める。
計算量としては、O(H^3W^3となる)。

実装としては解法１のほうが楽そうなのでそちらを使う。
"""

from itertools import combinations
from copy import deepcopy
from collections import deque

H,W = map(int,input().split())
MAP = [list(input()) for _ in range(H)]

nodeList = []
for i in range(H):
    for j in range(W):
        if MAP[i][j] == ".":
            nodeList.append((i,j))

adjecents = [(1,0),(0,1),(-1,0),(0,-1)]
ans = 0
for start,goal in list(combinations(nodeList,2)):
    copyMAP = deepcopy(MAP)
    que = deque([[start,0]])
    while que:
        node,step = que.popleft()
        if node == goal:
            ans = max(ans,step)
            break
        else:
            i,j = node
            if copyMAP[i][j] == ".":
                copyMAP[i][j] == "#"
                for a,b in adjecents:
                    x = i+a
                    y = j+b
                    if 0<=x<H and 0<=y<W and copyMAP[x][y]==".":
                        que.append([(x,y),step+1])
print(ans)
