#include<bits/stdc++.h>
using namespace std;
int labyrinth(vector<vector<char>>,vector<vector<int>>&,int a,int b);
int main()
{
int tc,c,r,i,j,k,fans,temp;
string str;
cin>>tc;
for(i=0;i<tc;i++){
fans=0;
cin>>c>>r;
vector<vector<char>> arr(r,vector<char> (c));
vector<vector<int>> ans(r,vector<int> (c,-1));
for(j=0;j<r;j++){
cin>>str;
for(k=0;k<c;k++){
arr[j][k]=str[k];
}
}
for(j=0; j<r; j++)
for(k=0; k<c; k++){
if(arr[j][k]=='.' && ans[j][k]==-1){
temp=labyrinth(arr,ans,j,k);
if(temp>fans)
fans=temp;
}
}
if(fans-1==-1)
cout<<"Maximum rope length is 0."<<endl;
else
cout<<"Maximum rope length is "<<fans-1<<"."<<endl;
}
return 0;
}
int labyrinth(vector<vector<char>> arr,vector<vector<int>> &ans,int a,int b)
{
vector<int> temp;
int i,j,value=0,flag;
stack<pair<int,int>> stk;
map<pair<int,int>,int> mp;
stk.push({a,b});
mp[{a,b}]=value;
while(!stk.empty()){
flag=0;
i=stk.top().first;
j=stk.top().second;
value=mp[{i,j}];
value++;
ans[i][j]=value;
stk.pop();
//top
if(i-1>=0 && arr[i-1][j]=='.' && ans[i-1][j]==-1){
stk.push({i-1,j});
mp[{i-1,j}]=value;
flag=1;
}
//left
if(j-1>=0 && arr[i][j-1]=='.' && ans[i][j-1]==-1){
stk.push({i,j-1});
mp[{i,j-1}]=value;
flag=1;
}
//right
if(j+1<=arr[0].size()-1 && arr[i][j+1]=='.' && ans[i][j+1]==-1){
stk.push({i,j+1});
mp[{i,j+1}]=value;
flag=1;
}
//down
if(i+1<=arr.size()-1 && arr[i+1][j]=='.' && ans[i+1][j]==-1){
stk.push({i+1,j});
mp[{i+1,j}]=value;
flag=1;
}
if(flag==0)
temp.push_back(value);
}
return *max_element(temp.begin(),temp.end());
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IGxhYnlyaW50aCh2ZWN0b3I8dmVjdG9yPGNoYXI+Pix2ZWN0b3I8dmVjdG9yPGludD4+JixpbnQgYSxpbnQgYik7CmludCBtYWluKCkKewogICAgaW50IHRjLGMscixpLGosayxmYW5zLHRlbXA7CiAgICBzdHJpbmcgc3RyOwogICAgY2luPj50YzsKICAgIGZvcihpPTA7aTx0YztpKyspewogICAgICAgIGZhbnM9MDsKICAgICAgICBjaW4+PmM+PnI7CiAgICAgICAgdmVjdG9yPHZlY3RvcjxjaGFyPj4gYXJyKHIsdmVjdG9yPGNoYXI+IChjKSk7CiAgICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBhbnMocix2ZWN0b3I8aW50PiAoYywtMSkpOwogICAgICAgIGZvcihqPTA7ajxyO2orKyl7CiAgICAgICAgICAgICAgICBjaW4+PnN0cjsKICAgICAgICAgICAgZm9yKGs9MDtrPGM7aysrKXsKICAgICAgICAgICAgICAgIGFycltqXVtrXT1zdHJba107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yKGo9MDsgajxyOyBqKyspCiAgICAgICAgICAgIGZvcihrPTA7IGs8YzsgaysrKXsKICAgICAgICAgICAgICAgIGlmKGFycltqXVtrXT09Jy4nICYmIGFuc1tqXVtrXT09LTEpewogICAgICAgICAgICAgICAgICAgIHRlbXA9bGFieXJpbnRoKGFycixhbnMsaixrKTsKICAgICAgICAgICAgICAgICAgICBpZih0ZW1wPmZhbnMpCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbnM9dGVtcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZihmYW5zLTE9PS0xKQogICAgICAgICAgICAgICAgY291dDw8Ik1heGltdW0gcm9wZSBsZW5ndGggaXMgMC4iPDxlbmRsOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBjb3V0PDwiTWF4aW11bSByb3BlIGxlbmd0aCBpcyAiPDxmYW5zLTE8PCIuIjw8ZW5kbDsKICAgIH0KICAgIHJldHVybiAwOwp9CmludCBsYWJ5cmludGgodmVjdG9yPHZlY3RvcjxjaGFyPj4gYXJyLHZlY3Rvcjx2ZWN0b3I8aW50Pj4gJmFucyxpbnQgYSxpbnQgYikKewogICAgdmVjdG9yPGludD4gdGVtcDsKICAgIGludCBpLGosdmFsdWU9MCxmbGFnOwogICAgc3RhY2s8cGFpcjxpbnQsaW50Pj4gc3RrOwogICAgbWFwPHBhaXI8aW50LGludD4saW50PiBtcDsKICAgIHN0ay5wdXNoKHthLGJ9KTsKICAgIG1wW3thLGJ9XT12YWx1ZTsKICAgIHdoaWxlKCFzdGsuZW1wdHkoKSl7CiAgICAgICAgZmxhZz0wOwogICAgICAgIGk9c3RrLnRvcCgpLmZpcnN0OwogICAgICAgIGo9c3RrLnRvcCgpLnNlY29uZDsKICAgICAgICB2YWx1ZT1tcFt7aSxqfV07CiAgICAgICAgdmFsdWUrKzsKICAgICAgICBhbnNbaV1bal09dmFsdWU7CiAgICAgICAgc3RrLnBvcCgpOwogICAgICAgIC8vdG9wCiAgICAgICAgaWYoaS0xPj0wICYmIGFycltpLTFdW2pdPT0nLicgJiYgYW5zW2ktMV1bal09PS0xKXsKICAgICAgICAgICAgc3RrLnB1c2goe2ktMSxqfSk7CiAgICAgICAgICAgIG1wW3tpLTEsan1dPXZhbHVlOwogICAgICAgICAgICBmbGFnPTE7CiAgICAgICAgfQogICAgICAgIC8vbGVmdAogICAgICAgIGlmKGotMT49MCAmJiBhcnJbaV1bai0xXT09Jy4nICYmIGFuc1tpXVtqLTFdPT0tMSl7CiAgICAgICAgICAgIHN0ay5wdXNoKHtpLGotMX0pOwogICAgICAgICAgICBtcFt7aSxqLTF9XT12YWx1ZTsKICAgICAgICAgICAgZmxhZz0xOwogICAgICAgIH0KICAgICAgICAvL3JpZ2h0CiAgICAgICAgaWYoaisxPD1hcnJbMF0uc2l6ZSgpLTEgJiYgYXJyW2ldW2orMV09PScuJyAmJiBhbnNbaV1baisxXT09LTEpewogICAgICAgICAgICBzdGsucHVzaCh7aSxqKzF9KTsKICAgICAgICAgICAgbXBbe2ksaisxfV09dmFsdWU7CiAgICAgICAgICAgIGZsYWc9MTsKICAgICAgICB9CiAgICAgICAgLy9kb3duCiAgICAgICAgaWYoaSsxPD1hcnIuc2l6ZSgpLTEgJiYgYXJyW2krMV1bal09PScuJyAmJiBhbnNbaSsxXVtqXT09LTEpewogICAgICAgICAgICBzdGsucHVzaCh7aSsxLGp9KTsKICAgICAgICAgICAgbXBbe2krMSxqfV09dmFsdWU7CiAgICAgICAgICAgIGZsYWc9MTsKICAgICAgICB9CiAgICAgICAgaWYoZmxhZz09MCkKICAgICAgICAgICAgdGVtcC5wdXNoX2JhY2sodmFsdWUpOwogICAgfQogICAgcmV0dXJuICptYXhfZWxlbWVudCh0ZW1wLmJlZ2luKCksdGVtcC5lbmQoKSk7Cn0K