h, w = map(int, input().split())
maze = []
for i in range(h):
  a = input()
  k = []
  for j in range(w):
    k.append(a[j])
  maze.append(k)
  
def clear_maze(sx, sy, gx, gy, maze):


    INF = 100000000

    field_x_length = h
    field_y_length = w
    distance = [[INF for i in range(field_y_length)] for j in range(field_x_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):
                    if (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 = 0  
for i in range(h):
  for j in range(w):
    for u in range(h):
      for v in range(w):
        if maze[i][j] == "." and maze[u][v] == ".":
          a = clear_maze(i, j, u, v, maze)
          ans = max(ans, a)
print(ans)