#First In First Outのキュー
from collections import deque #dequeを用いる

import copy #参照渡し

#入力
h,w= map(int,input().split())

maze = [list(input()) for _ in range(h)] #訪問先を変更するために、listにする

ans=0

def bfs(sx,sy,c):
  maxlen=0
  que = deque() #キューに要素を追加するときはque.append([i,j])、取り出すときはque.popleft()
  que.append([sx,sy,0]) #初期値

  dxy = [[1, 0], [0, 1], [-1, 0], [0, -1]] # ↓、→、←、↑

  #bfs キューから取り出し、移動先をキューに追加、キューから取り出し、移動先をキューに追加...を繰り返す
  while que: #ゴールに着くまでにキューの要素がなくなったらゴール不可

    x,y,tmp = que.popleft() #キューから要素を取り出す（座標を取り出す）

    for dx,dy in dxy: #(x,y)→(next_x,next_y)の1マス分の移動を考える（上下左右で4パターン存在）

      if 0 <= x+dx < w and 0 <= y+dy < h and c[y+dy][x+dx]=='.': #(移動先は行列内) かつ (空きマスの場合)
        que.append([x+dx,y+dy,tmp+1]) #キューに移動先を追加して、移動先の手数を+1する
        c[y+dy][x+dx] = '@' #訪問済みは@に置換する
        maxlen=max(maxlen,tmp+1)# maxlenを更新
  return maxlen

for Sy in range(h):
  for Sx in range(w):
    Maze=copy.deepcopy(maze)
    if Maze[Sy][Sx]=='.':
      #print(Sy,Sx,Gy,Gx,Maze)
      Tmp=bfs(Sx,Sy,Maze)
      #print(Sy,Sx,Gy,Gx,Maze)
      ans=max(ans,Tmp)
print(ans)