'''ika tako

スタートが決められたとき、そこから最も遠いマスは、

幅優先探索で最後に訪れたマスとなる。

よって、道である各マスをスタート地点として全て試し、

最長移動距離の最大値が答え。

H,W  の上限が小さいので、スタート地点候補が最大400、

1回の探索で探索するマスが最大400、あわせて160000回に

比例する計算量で間に合う。

'''

from collections import deque

 

def bfs(field, s):

    MOVE = [(0, 1), (1, 0), (0, -1), (-1, 0)]

    q = deque([(0, s)])

    dist = [[-1] * w for _ in range(h)]

 

    d, i, j = -1, -1, -1

    while q:

        d, (i, j) = q.popleft()

        if dist[i][j] != -1:

            continue

        dist[i][j] = d

        for di, dj in MOVE:

            ni, nj = i + di, j + dj

            if not 0 <= ni < h or not 0 <= nj < w:

                continue

            if field[ni][nj] == '#':

                continue

            if dist[ni][nj] != -1:

                continue

            q.append((d + 1, (ni, nj)))

    return d, i, j



h, w = list(map(int, input().split()))

field = [eval(input()) for _ in range(h)]

ans = 0

for i in range(h):

    for j in range(w):

        if field[i][j] == '.':

            d, i, j = bfs(field, (i, j))

            ans = max(ans, d)

print(ans)
from collections import deque

def MI(): return list(map(int, input().split()))

def bfs(field,s):

  q=deque([(0,s)])

  MOVE=[(-1,0),(0,-1),(0,1),(1,0)]

  d,i,j=-1,-1,-1

  dist=[[-1]*W for i in range(H)]  

  while q:

    d,(i,j)=q.popleft()

    if dist[i][j]!=-1:

      continue

    dist[i][j]=d

    for di,dj in MOVE:

      ni=i+di

      nj=j+dj

      if not 0<=ni<H or not 0<=nj<W:

        continue

      if field[ni][nj]=='#':

        continue

      if dist[ni][nj]!=-1:

        continue

      q.append((d+1,(ni,nj)))

  return d,i,j

H,W=MI()

field=[eval(input()) for _ in range(H)]

ans=0

for i in range(H):

  for j in range(W):

    if field[i][j]=='.':

      d,i,j=bfs(field,(i,j))      

      ans=max(ans,d)

print(ans)
"""ika tako
スタートが決められたとき、そこから最も遠いマスは、
幅優先探索で最後に訪れたマスとなる。
よって、道である各マスをスタート地点として全て試し、
最長移動距離の最大値が答え。
H,W  の上限が小さいので、スタート地点候補が最大400、
1回の探索で探索するマスが最大400、あわせて160000回に
比例する計算量で間に合う。
"""
from collections import deque


def bfs(field, s):
    MOVE = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    q = deque([(0, s)])
    dist = [[-1] * w for _ in range(h)]
    d, i, j = -1, -1, -1
    while q:
        d, (i, j) = q.popleft()
        if dist[i][j] != -1:
            continue
        dist[i][j] = d
        for di, dj in MOVE:
            ni, nj = i + di, j + dj
            if not 0 <= ni < h or not 0 <= nj < w:
                continue
            if field[ni][nj] == "#":
                continue
            if dist[ni][nj] != -1:
                continue
            q.append((d + 1, (ni, nj)))
    return d, i, j


h, w = list(map(int, input().split()))
field = [eval(input()) for _ in range(h)]
ans = 0
for i in range(h):
    for j in range(w):
        if field[i][j] == ".":
            d, i, j = bfs(field, (i, j))
            ans = max(ans, d)
print(ans)

from collections import deque


def MI():
    return list(map(int, input().split()))


def bfs(field, s):
    q = deque([(0, s)])
    MOVE = [(-1, 0), (0, -1), (0, 1), (1, 0)]
    d, i, j = -1, -1, -1
    dist = [[-1] * W for i in range(H)]
    while q:
        d, (i, j) = q.popleft()
        if dist[i][j] != -1:
            continue
        dist[i][j] = d
        for di, dj in MOVE:
            ni = i + di
            nj = j + dj
            if not 0 <= ni < H or not 0 <= nj < W:
                continue
            if field[ni][nj] == "#":
                continue
            if dist[ni][nj] != -1:
                continue
            q.append((d + 1, (ni, nj)))
    return d, i, j


H, W = MI()
field = [eval(input()) for _ in range(H)]
ans = 0
for i in range(H):
    for j in range(W):
        if field[i][j] == ".":
            d, i, j = bfs(field, (i, j))
            ans = max(ans, d)
print(ans)

-"""ika tako -スタートが決められたとき、そこから最も遠いマスは、 -幅優先探索で最後に訪れたマスとなる。 -よって、道である各マスをスタート地点として全て試し、 -最長移動距離の最大値が答え。 -H,W  の上限が小さいので、スタート地点候補が最大400、 -1回の探索で探索するマスが最大400、あわせて160000回に -比例する計算量で間に合う。 -""" +def MI(): +    return list(map(int, input().split())) + + -    MOVE = [(0, 1), (1, 0), (0, -1), (-1, 0)] -    dist = [[-1] * w for _ in range(h)] +    MOVE = [(-1, 0), (0, -1), (0, 1), (1, 0)] +    dist = [[-1] * W for i in range(H)] -            ni, nj = i + di, j + dj -            if not 0 <= ni < h or not 0 <= nj < w: +            ni = i + di +            nj = j + dj +            if not 0 <= ni < H or not 0 <= nj < W: -h, w = list(map(int, input().split())) -field = [eval(input()) for _ in range(h)] +H, W = MI() +field = [eval(input()) for _ in range(H)] -for i in range(h): -    for j in range(w): +for i in range(H): +    for j in range(W):