#!/usr/bin/python3
# -*- coding:utf-8 -*-

import numpy
from itertools import product
from collections import deque


def bfs(maze, s):
  dq = deque()
  count = 0
  dq.append((s[0], s[1], count))
  visited = numpy.zeros(maze.shape, dtype=numpy.int)
  while dq:
    x, y, count = dq.popleft()
    for id in range(4):
      dx, dy = map(lambda x:int(x.real), [(0+1j)**(id), (0+1j)**(id+1)])
      if x+dx < 0 or y+dy < 0 or maze.shape[0] <= x+dx or maze.shape[1] <= y+dy:
        continue
      if maze[x+dx, y+dy]==1 and visited[x+dx, y+dy]!=1:
        dq.append((x+dx, y+dy, count+1))
        visited[(x+dx, y+dy)] = 1
  return count


def main():
  h, w = map(int, input().strip().split())
  maze = numpy.zeros((h, w), dtype=numpy.int)
  scores = numpy.full((h, w), -1, dtype=numpy.int)
  for ih in range(h):
    maze[ih] = [(0 if c=='#' else 1)for c in input().strip('')]
  for sx, sy in product(range(h), range(w)):
    if maze[sx, sy] == 0:
      continue
    scores[sx, sy] = bfs(maze, (sx, sy))
  print(numpy.max(scores))


if __name__=='__main__':
  main()