#!/usr/bin/env python3
from collections import deque

H, W = [int(s) for s in input().split()]
fields = []
for _ in range(H):
    fields.append(list(input()))

fields_num = []
for i in range(H):
    for j in range(W):
        fields_num.append((i, j))


def get_search_obj(i, j):
    ret = []
    moving_range = [[1, 0], [0, 1], [-1, 0], [0, -1]]
    for dx, dy in moving_range:
        if 0 <= (i + dx) <= (H - 1) and 0 <= (j + dy) <= (W - 1) and fields[i + dx][j + dy] == '.':
            ret.append((i + dx, j + dy))
    return ret


def bfs(start, end):
    start = [start[0], start[1], 0]
    dq = deque([start])
    visited = [[False] * W for _ in range(H)]
    while dq:
        sx, sy, cnt = dq.pop()
        for x, y in get_search_obj(sx, sy):
            if x == end[0] and y == end[1]:
                return cnt + 1
            if not visited[x][y]:
                dq.appendleft([x, y, cnt + 1])
                visited[x][y] = True
    return 0


max_hop = 0
for i in range(H * W):
    for j in range(H * W):
        h1, w1 = fields_num[i]
        h2, w2 = fields_num[j]
        if fields[h1][w1] == '.' and fields[h2][w2] == '.':
            max_hop = max(max_hop, bfs((h1, w1), (h2, w2)))

print(max_hop)