# H（縦マス） W（横マス）
# 3 5
# ...#.
# .#.#.
# .#...  → ループ内では S[i][j] で表す

H, W = map(int, input().split())

S = [list(input()) for i in range(H)]
# Sは元の地図

T = [[0 for i in range(W)] for j in range(H)]
# Tはそれぞれの位置からの最大距離を示す（まず0、このあと距離を埋めていく）

for i in range(H):  
  for j in range(W):
    # このループ内で点[i][j]からの最大距離を求める
    # 0 <= i <= H-1
    # 0 <= j <= W-1
    
    if S[i][j] == "#":
      continue
    # もし点[i][j]が壁ならループを終了し次の点を調べる
    
    U = [[999 for i in range(W)] for j in range(H)]
    U[i][j] = 0
    # 点[i][j]から各点までの距離をUで表す（まず999で初期化）
    # ただし点[i][j]は0で自明
    
    queue = []
    if 0 <= i <= H-1 and 0 <= j-1 <= W-1:
      if S[i][j-1] == ".":
        queue.append([i, j-1])
    if 0 <= i <= H-1 and 0 <= j+1 <= W-1:
      if S[i][j+1] == ".":
        queue.append([i, j+1])
    if 0 <= i-1 <= H-1 and 0 <= j <= W-1:
      if S[i-1][j] == ".":
        queue.append([i-1, j])
    if 0 <= i+1 <= H-1 and 0 <= j <= W-1:
      if S[i+1][j] == ".":
        queue.append([i+1, j])
    # 最初の点の周辺をqueueに追加

    while queue != []:
      
      [qi, qj] = queue.pop(0) # queueの先頭を取得して削除

      kyori = []
      if 0 <= qi <= H-1 and 0 <= qj-1 <= W-1:
        kyori.append(U[qi][qj-1])
        if U[qi][qj-1] == 999 and S[qi][qj-1] == ".":
          queue.append([qi, qj-1])
      if 0 <= qi <= H-1 and 0 <= qj+1 <= W-1:
        kyori.append(U[qi][qj+1])
        if U[qi][qj+1] == 999 and S[qi][qj+1] == ".":
          queue.append([qi, qj+1])
      if 0 <= qi-1 <= H-1 and 0 <= qj <= W-1:
        kyori.append(U[qi-1][qj])
        if U[qi-1][qj] == 999 and S[qi-1][qj] == ".":
          queue.append([qi-1, qj])
      if 0 <= qi+1 <= H-1 and 0 <= qj <= W-1:
        kyori.append(U[qi+1][qj])
        if U[qi+1][qj] == 999 and S[qi+1][qj] == ".":
          queue.append([qi+1, qj])
      U[qi][qj] = min(kyori) + 1
      # queueの先頭から最初の点[i][j]までの距離をUに代入      
      # queueの先頭に隣接する点のうち、まだ考慮していない分をqueueに追加

    # 点[i][j]からの最大の距離をTに代入する（開始）
    for k in range(H):
      for l in range(W):
        if T[i][j] < U[k][l] and S[k][l] == ".":
          T[i][j] = U[k][l]
    # 点[i][j]からの最大の距離をTに代入する（終了）

# ここまででTが全て埋まる

maxkyori = 0
for i in range(H):
  for j in range(W):
    if maxkyori < T[i][j]:
      maxkyori = T[i][j]

print(maxkyori)