def bfs(cells, x, y):
    ops = [(1, 0), (-1, 0), (0, 1), (0, -1)]
    h = len(cells)
    w = len(cells[0])
    q = [(x, y, 0)]
    result = 0
    passed = set()
    while q:
        x, y, val = q.pop(0)
        passed.add((x, y))
        for dx, dy in ops:
            new_x, new_y, new_val = x + dx, y + dy, val + 1
            if ((new_x, new_y) in passed or not 0 <= new_x <= w - 1
                    or not 0 <= new_y <= h - 1 or cells[new_y][new_x] == '#'):
                continue
            result = max(result, new_val)
            q.append((new_x, new_y, val + 1))
    return result


def main():
    """
    1. 適当なルートをスタート地点として最短距離を求める。
    2. 1のルートで通ったセルを覗いて別の道から最短距離を求める
    3. 2の途中で1.で通ったセルに出会ったらそこで探索を中断し、1の結果を足す。
    """

    h, w = map(int, input().split(' '))
    cells = []
    for _ in range(h):
        row = list(input())
        cells.append(row)

    m = 0
    for y, row in enumerate(cells):
        for x, cell in enumerate(row):
            if cell == '.':
                m = max(m, bfs(cells, x, y))
    print(m)


main()
