#include <iostream>
#include <cstring>
#include <stack>
#define maxn 1000
using namespace std;
stack <int> s;
char g[maxn][maxn];
bool used[maxn][maxn];
int n,m, max_d=0, root_x=0, root_y=0;
void dfs(int cx,int cy, int h){
s.push(cx);
s.push(cy);
s.push(h);
while(!s.empty()){
int h=s.top();
s.pop();
int y=s.top();
s.pop();
int x=s.top();
s.pop();
used[x][y]=true;
if(h>max_d)
max_d=h,root_x=x,root_y=y;
if(x>0 && g[x-1][y]=='.' && !used[x-1][y])
s.push(x-1),s.push(y),s.push(h+1);
if(y>0 && g[x][y-1]=='.' && !used[x][y-1])
s.push(x),s.push(y-1),s.push(h+1);
if(x<n-1 && g[x+1][y]=='.' && !used[x+1][y])
s.push(x+1),s.push(y),s.push(h+1);
if(y<m-1 && g[x][y+1]=='.' && !used[x][y+1])
s.push(x),s.push(y+1),s.push(h+1);
}
}
int main(){
cin>>m>>n;
for(int i=0; i<n; ++i){
cin>>g[i];
for(int j=0; j<m; ++j)
used[i][j]=false;
}
for(int i=0; i<n; ++i){
for(int j=0; j<m; ++j)
if(g[i][j]=='.' && !used[i][j]){
dfs(i,j,0);
for(int k=0;k<n;++k)
for(int l=0;l<m;++l)
used[k][l]=0;
dfs(root_x,root_y,0);
}
}
cout<<max_d<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPHN0YWNrPgojZGVmaW5lIG1heG4gMTAwMAp1c2luZyBuYW1lc3BhY2Ugc3RkOwpzdGFjayA8aW50PiBzOwpjaGFyIGdbbWF4bl1bbWF4bl07CmJvb2wgdXNlZFttYXhuXVttYXhuXTsKaW50IG4sbSwgbWF4X2Q9MCwgcm9vdF94PTAsIHJvb3RfeT0wOwp2b2lkIGRmcyhpbnQgY3gsaW50IGN5LCBpbnQgaCl7CiAgICBzLnB1c2goY3gpOwogICAgcy5wdXNoKGN5KTsKICAgIHMucHVzaChoKTsKICAgIHdoaWxlKCFzLmVtcHR5KCkpewogICAgICAgIGludCBoPXMudG9wKCk7CiAgICAgICAgcy5wb3AoKTsKICAgICAgICBpbnQgeT1zLnRvcCgpOwogICAgICAgIHMucG9wKCk7CiAgICAgICAgaW50IHg9cy50b3AoKTsKICAgICAgICBzLnBvcCgpOwogICAgICAgIHVzZWRbeF1beV09dHJ1ZTsKICAgIGlmKGg+bWF4X2QpCiAgICAgICAgbWF4X2Q9aCxyb290X3g9eCxyb290X3k9eTsKICAgIGlmKHg+MCAmJiBnW3gtMV1beV09PScuJyAmJiAhdXNlZFt4LTFdW3ldKQogICAgICAgIHMucHVzaCh4LTEpLHMucHVzaCh5KSxzLnB1c2goaCsxKTsKICAgIGlmKHk+MCAmJiBnW3hdW3ktMV09PScuJyAmJiAhdXNlZFt4XVt5LTFdKQogICAgICAgIHMucHVzaCh4KSxzLnB1c2goeS0xKSxzLnB1c2goaCsxKTsKICAgIGlmKHg8bi0xICYmIGdbeCsxXVt5XT09Jy4nICYmICF1c2VkW3grMV1beV0pCiAgICAgICAgcy5wdXNoKHgrMSkscy5wdXNoKHkpLHMucHVzaChoKzEpOwogICAgaWYoeTxtLTEgJiYgZ1t4XVt5KzFdPT0nLicgJiYgIXVzZWRbeF1beSsxXSkKICAgICAgIHMucHVzaCh4KSxzLnB1c2goeSsxKSxzLnB1c2goaCsxKTsKICAgIH0KfQppbnQgbWFpbigpewogICAgY2luPj5tPj5uOwogICAgZm9yKGludCBpPTA7IGk8bjsgKytpKXsKICAgICAgICBjaW4+PmdbaV07CiAgICAgICAgZm9yKGludCBqPTA7IGo8bTsgKytqKQogICAgICAgICAgICAgdXNlZFtpXVtqXT1mYWxzZTsKICAgIH0KICAgIGZvcihpbnQgaT0wOyBpPG47ICsraSl7CiAgICAgICAgZm9yKGludCBqPTA7IGo8bTsgKytqKQogICAgICAgICAgICBpZihnW2ldW2pdPT0nLicgJiYgIXVzZWRbaV1bal0pewogICAgICAgICAgICAgICAgZGZzKGksaiwwKTsKICAgICAgICAgICAgICAgIGZvcihpbnQgaz0wO2s8bjsrK2spCiAgICAgICAgICAgICAgICAgICAgZm9yKGludCBsPTA7bDxtOysrbCkKICAgICAgICAgICAgICAgICAgICAgICAgdXNlZFtrXVtsXT0wOwogICAgICAgICAgICAgICAgZGZzKHJvb3RfeCxyb290X3ksMCk7CiAgICAgICAgfQogICAgfQogICAgY291dDw8bWF4X2Q8PGVuZGw7CiAgICByZXR1cm4gMDsKfQ==