<?php
// $n = (int)trim(fgets(STDIN));
$input = explode(' ', trim(fgets(STDIN)));
$INF = 500;

$h = (int)$input[0];
$w = (int)$input[1];

$v_list = [];
for ($i=1; $i <= $h; $i++) { 
	$input = trim(fgets(STDIN));
	for ($j=1; $j <= $w ; $j++) { 
		if ($input[$j-1] == '.') {
			$v_list[] = [$i, $j];
		}
	}
}
// 距離を初期化
$v_length = count($v_list);
$dist = [];
for ($i=0; $i < $v_length; $i++) { 
	for ($j=0; $j < $v_length; $j++) { 
		if (isset($dist[$j][$i])) {
			$dist[$i][$j] = $dist[$j][$i];
			continue;
		}
		$d = $INF;
		if ($i == $j) {
			$d = 0;
		}else{
			$v1 = $v_list[$i];
			$v2 = $v_list[$j];
			if ($v1[0] === $v2[0]) {
				switch (abs($v1[1] - $v2[1])) {
					case 0:
						$d = 0;
						break;
					case 1:
						$d = 1;
						break;
				}
			}else if ($v1[1] === $v2[1]) {
				switch (abs($v1[0] - $v2[0])) {
					case 0:
						$d = 0;
						break;
					case 1:
						$d = 1;
						break;
				}
			}
		}
		$dist[$i][$j] = $d;
	}
}
// ワーシャルフロイド
for ($i=0; $i < $v_length; $i++) { 
	for ($j=0; $j < $v_length; $j++) { 
		if ($i == $j || $dist[$i][$j] == $INF) {
			continue;
		}
		for ($k=0; $k < $v_length; $k++) { 
			if ($dist[$j][$k] > $dist[$j][$i] + $dist[$i][$k]) {
				$dist[$j][$k] = $dist[$j][$i] + $dist[$i][$k];
			}
		}
	}
}
$max = 0;
for ($i=0; $i < $v_length; $i++) { 
	for ($j=0; $j < $v_length; $j++) { 
		if ($dist[$i][$j] < $INF) {
			$max = max($max, $dist[$i][$j]);
		}
	}
}
echo $max;
