using System;
using System.Linq;
using System.Collections.Generic;

namespace Algorithm
{
    class Program
    {
        static void Main(string[] args)
        {
            var l = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int H = l[0], W = l[1];

            var map = new char[H][];
            var ans = new int[H][];
            for (var i = 0; i < H; i++)
            {
                map[i] = Console.ReadLine().ToCharArray();
            }

            var directY = new int[] { -1, 0, 1, 0 };
            var directX = new int[] { 0, 1, 0, -1 };
            var max = 0;

            for (var sy = 0; sy < H; sy++)
            {
                for (var sx = 0; sx < W; sx++)
                {
                    if (map[sy][sx] == '#') continue;
                    for (var gy = 0; gy < H; gy++)
                    {
                        for (var gx = 0; gx < W; gx++)
                        {
                            if (map[gy][gx] == '#') continue;
                            if (sy == gy && sx == gx) continue;

                            var queue = new Queue<Tuple<int, int>>();
                            queue.Enqueue(new Tuple<int, int>(sy, sx));
                            for (var i = 0; i < H; i++)
                            {
                                ans[i] = Enumerable.Repeat(-1, W).ToArray();
                            }
                            ans[sy][sx] = 0;
                            while (queue.Count > 0)
                            {
                                var d = queue.Dequeue();
                                int y = d.Item1, x = d.Item2;
                                for (var i = 0; i < 4; i++)
                                {
                                    var indY = y + directY[i];
                                    var indX = x + directX[i];
                                    if (indY < 0 || indY >= H || indX < 0 || indX >= W) continue;
                                    if (ans[indY][indX] == -1 && map[indY][indX] == '.')
                                    {
                                        queue.Enqueue(new Tuple<int, int>(indY, indX));
                                        ans[indY][indX] = Math.Max(ans[y][x] + 1, ans[indY][indX]);
                                    }
                                }
                            }

                            max = Math.Max(max, ans[gy][gx]);
                        }
                    }
                }
            }

            Console.WriteLine(max);
        }
    }
}