#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <utility>
using namespace std;
//英语 看博友分析 抄博友程序 树的直径 bfs 背
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
char da[1008][1008];
int vis[1008][1008];
int cx;
int cy;
int ans;
int m,n;
struct nod{
int x;
int y;
int zhi;
};
void bfs(int x,int y)
{
cx=x;
cy=y;
memset(vis,0,sizeof(vis));
queue<nod > que;
que.push((nod){x,y,0});
vis[x][y]=1;
while(que.empty()!=1)
{
int tx=que.front().x;
int ty=que.front().y;
int tz=que.front().zhi;
if(ans<(tz))
{
ans=tz;
cx=tx;
cy=ty;
}
//cout<<tx<<" "<<ty<<" "<<tz<<endl;
que.pop();
for(int i=0;i<4;i++)
{
int ax=tx+dx[i];
int ay=ty+dy[i];
if(ax>=0 && ax<n && ay>=0 && ay<m && vis[ax][ay]==0 && da[ax][ay]=='.')
{
//cout<<"hi"<<endl;
que.push((nod){ax,ay,tz+1});
vis[ax][ay]=1;
}
}
}
}
int main()
{
int T;
//cin>>T;
scanf("%d",&T);
while(T--)
{
//cin>>m>>n;
scanf("%d%d",&m,&n);
int x,y;
for(int i=0;i<n;i++)
{
scanf("%s",da[i]);
//cout<<da[i]<<endl;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(da[i][j]=='.')
{
x=i;
y=j;
}
}
}
/*
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout<<da[i][j];
}
cout<<endl;
}*/
ans=0;
//cout<<x<<" "<<y<<endl;
bfs(x,y);
ans=0;
//cout<<cx<<" "<<cy<<endl;
bfs(cx,cy);
cout<<"Maximum rope length is "<<ans<<"."<<endl;
}
return 0;
}