H,W=map(int,input().split()) #高さ、幅取得
maze=[]
for i in range(H):
  S=list(str(input()))
  maze.append(S)
# sx,sy=スタートの座標 gx,gy=ゴールの座標
def clear_maze(sx, sy, gx, gy, maze):

    INF = 100000000

    field_x_length = len(maze[0]) #幅
    field_y_length = len(maze) #高さ
    distance = [[INF for i in range(field_x_length)] for j in range(field_y_length)]
    #    distance = [[None]*field_x_length]*field_y_length

    def bfs():
        queue = []

        queue.insert(0, (sx, sy))

        distance[sy][sx] = 0

        while len(queue):
            x, y = queue.pop()

            if x == gx and y == gy:
                break

            for i in range(0, 4):
                nx, ny = x + [1, 0, -1, 0][i], y + [0, 1, 0, -1][i]

                if (0 <= nx and nx < field_x_length and 0 <= ny and ny < field_y_length and maze[ny][nx] != '#' and distance[ny][nx] == INF):
                    queue.insert(0, (nx, ny))
                    distance[ny][nx] = distance[y][x] + 1


        return distance[gy][gx]

    return bfs()
dist=0
INF = 100000000
H= len(maze)
W= len(maze[0])
for i in range(W):
  for j in range(H):
    for k in range(W):
      for l in range(H):
        dist0=clear_maze(i, j, k, l, maze)
        if dist0>dist and dist0 != INF:
          dist=dist0
print(dist)