#include <bits/stdc++.h>>
using namespace std;
#define For(i,a,b) for(int i=(int)(a);i<=(int)(b);++i)
#define Fill(a,b) memset(&a,b,sizeof(a))
const int dr[]={0,0,1,-1};
const int dc[]={1,-1,0,0};
int cols, rows, maxd, maxr, maxc;
char s[1005][1005], v[1005][1005];
void dfs(int r, int c, int l){
if (l > maxd) {maxd=l; maxr=r; maxc=c;}
v[r][c]=1;
For(i,0,3) if (r+dr[i]>=0&&r+dr[i]<rows&&c+dc[i]>=0&&c+dc[i]<cols&&
v[r+dr[i]][c+dc[i]]==0&&s[r+dr[i]][c+dc[i]]=='.')
dfs(r+dr[i],c+dc[i],l+1);
}
int main(){
int t;
scanf("%d",&t);
For(z,1,t) {
scanf("%d%d\n",&cols,&rows);
For(j,1,rows) gets(s[j-1]);
For(i,0,rows-1) For(j,0,cols-1) if (s[i][j]=='.') {
maxd=-1; Fill(v,0);
dfs(i,j,0);
maxd=-1; Fill(v,0);
dfs(maxr,maxc,0);
printf("Maximum rope length is %d.\n",maxd);
goto fin;
}
fin:;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+PgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKI2RlZmluZSBGb3IoaSxhLGIpIGZvcihpbnQgaT0oaW50KShhKTtpPD0oaW50KShiKTsrK2kpCiNkZWZpbmUgRmlsbChhLGIpIG1lbXNldCgmYSxiLHNpemVvZihhKSkKIApjb25zdCBpbnQgZHJbXT17MCwwLDEsLTF9Owpjb25zdCBpbnQgZGNbXT17MSwtMSwwLDB9OwogCmludCBjb2xzLCByb3dzLCBtYXhkLCBtYXhyLCBtYXhjOwpjaGFyIHNbMTAwNV1bMTAwNV0sIHZbMTAwNV1bMTAwNV07CiAKdm9pZCBkZnMoaW50IHIsIGludCBjLCBpbnQgbCl7CglpZiAobCA+IG1heGQpIHttYXhkPWw7IG1heHI9cjsgbWF4Yz1jO30KCXZbcl1bY109MTsKCUZvcihpLDAsMykgaWYgKHIrZHJbaV0+PTAmJnIrZHJbaV08cm93cyYmYytkY1tpXT49MCYmYytkY1tpXTxjb2xzJiYKCQkJdltyK2RyW2ldXVtjK2RjW2ldXT09MCYmc1tyK2RyW2ldXVtjK2RjW2ldXT09Jy4nKQoJCWRmcyhyK2RyW2ldLGMrZGNbaV0sbCsxKTsKfQogCmludCBtYWluKCl7CQoJaW50IHQ7CglzY2FuZigiJWQiLCZ0KTsKCQoJRm9yKHosMSx0KSB7CgkJc2NhbmYoIiVkJWRcbiIsJmNvbHMsJnJvd3MpOwoJCUZvcihqLDEscm93cykgZ2V0cyhzW2otMV0pOwoJCUZvcihpLDAscm93cy0xKSBGb3IoaiwwLGNvbHMtMSkgaWYgKHNbaV1bal09PScuJykgewoJCQltYXhkPS0xOyBGaWxsKHYsMCk7CgkJCWRmcyhpLGosMCk7CgkJICAKCQkJbWF4ZD0tMTsgRmlsbCh2LDApOwoJCQlkZnMobWF4cixtYXhjLDApOwoJCSAgCgkJCXByaW50ZigiTWF4aW11bSByb3BlIGxlbmd0aCBpcyAlZC5cbiIsbWF4ZCk7CgkJCWdvdG8gZmluOwoJCX0KCQlmaW46OwoJfQoJCglyZXR1cm4gMDsKfQ==