// Package main provides
//
// File:  main.go
// Author: ymiyamoto
//
// Created on Thu Jan 16 12:15:24 2020
//
package main

import "fmt"

type pos struct {
	h int
	w int
}

var h, w int
var graph []string

func bfs(dists [][]int, i, j int) {
	q := make([]pos, 0)

	dists[i][j] = 0
	q = append(q, pos{i, j})

	for len(q) > 0 {
		t := q[0]
		q = q[1:]
		for _, p := range []pos{pos{-1, 0}, pos{1, 0}, pos{0, -1}, pos{0, 1}} {
			x := t.h + p.h
			y := t.w + p.w
			if 0 <= x && x < h && 0 <= y && y < w && dists[x][y] == -1 && graph[x][y] != '#' {
				dists[x][y] = dists[t.h][t.w] + 1
				q = append(q, pos{x, y})
			}
		}
	}
}

func main() {
	fmt.Scan(&h, &w)

	graph = make([]string, h)
	for i := range graph {
		fmt.Scan(&graph[i])
	}

	max := 0
	for i := 0; i < h; i++ {
		for j := 0; j < w; j++ {
			dists := make([][]int, h)
			for d := range dists {
				dists[d] = make([]int, w)
				for e := range dists[d] {
					dists[d][e] = -1
				}
			}

			bfs(dists, i, j)

			for _, dist := range dists {
				for _, d := range dist {
					if max < d {
						max = d
					}
				}
			}
		}
	}
	fmt.Println(max)
}
