# D
H, W = map(int, input().split())
maze = [list(input()) for i in range(H)]
def clear_maze(sx, sy, gx, gy, maze):

    INF = 100000000

    field_x_length = len(maze)
    field_y_length = len(maze[0])
    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[sx][sy] = 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[nx][ny] != '#' and distance[nx][ny] == INF):
                    queue.insert(0, (nx, ny))
                    distance[nx][ny] = distance[x][y] + 1


        return distance[gx][gy]

    return bfs()
ans = []
for i in range(H):
  for j in range(W):
    for k in range(H):
      for w in range(W):
        if (maze[i][j] != '#' and maze[k][w] != '#'):
          ans.append(clear_maze(i, j, k, w, maze))
print(max(ans))