#include <bits/stdc++.h>
using namespace std;
const int dx[5]={0,0,0,-1,1};
const int dy[5]={0,-1,1,0,0};
struct node {
	int x,y,s;
};
int n,m;
bool vis[30][30];
char a[30][30];
int bfs(int x,int y) {
	memset(vis,0,sizeof(vis));
	vis[x][y]=1;
	queue <node> q;
	q.push((node){x,y,0});
	int Max;
	while (!q.empty()) {
		node h=q.front();
		q.pop();
		for (int i=1; i<=4; i++) {
			int tx=h.x+dx[i],ty=h.y+dy[i];
			if (vis[tx][ty]==1||a[tx][ty]=='#'||tx<1||tx>n||ty<1||ty>m) {
				continue ;
			}
			vis[tx][ty]=1;
			q.push((node){tx,ty,h.s+1});
			Max=h.s+1;
		} 
	}
	return Max;
}
int main() {
	cin>>n>>m;
	for (int i=1; i<=n; i++) {
		for (int j=1; j<=m; j++) {
			cin>>a[i][j];
		}
	}
	int Max=0;
	for (int i=1; i<=n; i++) {
		for (int j=1; j<=m; j++) {
			if (a[i][j]=='#') {
				continue ;
			}
			Max=max(Max,bfs(i,j));
		}
	}
	cout<<Max;
    return 0;
}