import collections

H, W = [int(s) for s in input().split(' ')]

S = list()
for y in range(H):
    row = list(input())
    for x in range(W):
        if row[x] == '.':
            S.append((x, y))

graph = dict()
for s in S:
    graph[s] = list()
    if (s[0] > 0) and ((s[0] - 1, s[1]) in S):
        graph[s].append((s[0] - 1, s[1]))
    if (s[0] < W - 1) and ((s[0] + 1, s[1]) in S):
        graph[s].append((s[0] + 1, s[1]))
    if (s[1] > 0) and ((s[0], s[1] - 1) in S):
        graph[s].append((s[0], s[1] - 1))
    if (s[1] < H - 1) and ((s[0], s[1] + 1) in S):
        graph[s].append((s[0], s[1] + 1))

def max_route(S, graph):
    max_r = 0
    for root in S:
        r = breadth_first_search(graph, root)
        if r > 0 and r > max_r:
            max_r = r
    return max_r

def breadth_first_search(graph, root):
    visited = list()
    queue = collections.deque([root])
    step = 0
    while True:
        next_queue = collections.deque([])
        next_visited = list()
        while queue:
            vertex = queue.popleft()
            for neighbour in graph[vertex]:
                if neighbour not in visited:
                    next_visited.append(neighbour)
                    next_queue.append(neighbour)
        if len(next_queue) > 0:
            step += 1
            queue = next_queue
            visited.extend(next_visited)
            continue
        else:
            break

    return step

mr = max_route(S, graph)
print(mr)
