#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<vector>
#include<algorithm>
#define lli long long int
#define gc() getchar_unlocked()
using namespace std;
char arr[1002][1002];
char visited[1002][1002];
void input(lli r,lli c)
{
for(lli i=0;i<r;i++)
{
for(lli j=0;j<c;j++)
{
cin>>arr[i][j];
visited[i][j]='0';
}
}
}
void print(lli r,lli c)
{
for(lli i=0;i<r;i++)
{
for(lli j=0;j<c;j++)
{
printf("%c",arr[i][j]);
}
printf("\n");
}
}
void printv(lli r,lli c)
{
for(lli i=0;i<r;i++)
{
for(lli j=0;j<c;j++)
{
printf("%c",visited[i][j]);
}
printf("\n");
}
}
lli olx(lli i,lli j,lli count1,lli r,lli c)
{
// mx++;
if(i>=r || j>=c)
return count1;
visited[i][j]='1';//mark the cell visited so nxt time i will not have to compute again
lli x1=0,x2=0,x3=0,x4=0;
if(j+1<c)//dont cross colm
{
if(visited[i][j+1]=='0' && arr[i][j+1]=='.')//move right
{
x1=olx(i,j+1,count1+1,r,c);
}
}
if(j-1>=0)
{
if(visited[i][j-1]=='0' && arr[i][j-1]=='.')//move left
{
x2=olx(i,j-1,count1+1,r,c);
}
}
if(i+1<r)//move down
{
if(visited[i+1][j]=='0' && arr[i+1][j]=='.')
{
x3=olx(i+1,j,count1+1,r,c);
}
}
if(i-1>=0)//move up
{
if(visited[i-1][j]=='0' && i-1>=0 && arr[i-1][j]=='.')
{
x4=olx(i-1,j,count1+1,r,c);
}
}
return max(max(max(x1,x2),max(x3,x4)),count1);
}
lli oprtn(lli r,lli c)
{
lli z=-1,x=0;
//chck for each cell can we move
for(lli i=0;i<r;i++)
{
for(lli j=0;j<c;j++)
{
if(visited[i][j]=='0' && arr[i][j]=='.')//check weather movement is allowed
{
x=olx(i,j,0,r,c);
}
else
visited[i][j]='1';
if(x>z)
z=x;
}
}
return z;
}
int main()
{
lli t;
scanf("%lld",&t);
while(t--)
{
lli r,c;
scanf("%lld%lld",&c,&r);
input(r,c);
lli ans=oprtn(r,c);
printf("%lld\n",ans);
}
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2RlZmluZSBsbGkgbG9uZyBsb25nIGludAojZGVmaW5lIGdjKCkgZ2V0Y2hhcl91bmxvY2tlZCgpCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNoYXIgYXJyWzEwMDJdWzEwMDJdOwpjaGFyIHZpc2l0ZWRbMTAwMl1bMTAwMl07CnZvaWQgaW5wdXQobGxpIHIsbGxpIGMpCnsKICBmb3IobGxpIGk9MDtpPHI7aSsrKQogIHsKICAgIGZvcihsbGkgaj0wO2o8YztqKyspCiAgICB7CiAgICAgICBjaW4+PmFycltpXVtqXTsKICAgICAgIHZpc2l0ZWRbaV1bal09JzAnOwogICAgfQogIH0KfQp2b2lkIHByaW50KGxsaSByLGxsaSBjKQp7CiAgZm9yKGxsaSBpPTA7aTxyO2krKykKICB7CiAgICAgZm9yKGxsaSBqPTA7ajxjO2orKykKICAgICB7CiAgICAgICAgcHJpbnRmKCIlYyIsYXJyW2ldW2pdKTsKICAgICB9CiAgICAgcHJpbnRmKCJcbiIpOwogIH0KfQoKdm9pZCBwcmludHYobGxpIHIsbGxpIGMpCnsKICBmb3IobGxpIGk9MDtpPHI7aSsrKQogIHsKICAgICBmb3IobGxpIGo9MDtqPGM7aisrKQogICAgIHsKICAgICAgICBwcmludGYoIiVjIix2aXNpdGVkW2ldW2pdKTsKICAgICB9CiAgICAgcHJpbnRmKCJcbiIpOwogIH0KfQpsbGkgb2x4KGxsaSBpLGxsaSBqLGxsaSBjb3VudDEsbGxpIHIsbGxpIGMpCnsKICAvLyBteCsrOwogICBpZihpPj1yIHx8IGo+PWMpCiAgICAgcmV0dXJuIGNvdW50MTsKICAgdmlzaXRlZFtpXVtqXT0nMSc7Ly9tYXJrIHRoZSBjZWxsIHZpc2l0ZWQgc28gbnh0IHRpbWUgaSB3aWxsIG5vdCBoYXZlIHRvIGNvbXB1dGUgYWdhaW4KICAgbGxpIHgxPTAseDI9MCx4Mz0wLHg0PTA7CiAgIGlmKGorMTxjKS8vZG9udCBjcm9zcyBjb2xtCiAgIHsKICAgICBpZih2aXNpdGVkW2ldW2orMV09PScwJyAmJiBhcnJbaV1baisxXT09Jy4nKS8vbW92ZSByaWdodAogICAgIHsKICAgICAgIHgxPW9seChpLGorMSxjb3VudDErMSxyLGMpOwogICAgIH0KICAgfQogICBpZihqLTE+PTApCiAgIHsKICAgICBpZih2aXNpdGVkW2ldW2otMV09PScwJyAmJiBhcnJbaV1bai0xXT09Jy4nKS8vbW92ZSBsZWZ0CiAgICAgewogICAgICAgeDI9b2x4KGksai0xLGNvdW50MSsxLHIsYyk7CiAgICAgfQogICB9CgogICBpZihpKzE8cikvL21vdmUgZG93bgogICB7CiAgICAgIGlmKHZpc2l0ZWRbaSsxXVtqXT09JzAnICYmIGFycltpKzFdW2pdPT0nLicpCiAgICAgIHsKICAgICAgICB4Mz1vbHgoaSsxLGosY291bnQxKzEscixjKTsKICAgICAgfQogICB9CiAgIGlmKGktMT49MCkvL21vdmUgdXAKICAgewogICAgIGlmKHZpc2l0ZWRbaS0xXVtqXT09JzAnICYmIGktMT49MCAmJiBhcnJbaS0xXVtqXT09Jy4nKQogICAgIHsKICAgICAgIHg0PW9seChpLTEsaixjb3VudDErMSxyLGMpOwogICAgIH0KICAgfQogICByZXR1cm4gbWF4KG1heChtYXgoeDEseDIpLG1heCh4Myx4NCkpLGNvdW50MSk7Cgp9CmxsaSBvcHJ0bihsbGkgcixsbGkgYykKewogIGxsaSB6PS0xLHg9MDsKICAvL2NoY2sgZm9yIGVhY2ggY2VsbCBjYW4gd2UgbW92ZQogIGZvcihsbGkgaT0wO2k8cjtpKyspCiAgewogICAgZm9yKGxsaSBqPTA7ajxjO2orKykKICAgIHsKICAgICBpZih2aXNpdGVkW2ldW2pdPT0nMCcgJiYgYXJyW2ldW2pdPT0nLicpLy9jaGVjayB3ZWF0aGVyIG1vdmVtZW50IGlzIGFsbG93ZWQKICAgICB7CiAgICAgICB4PW9seChpLGosMCxyLGMpOwogICAgIH0KICAgICBlbHNlCiAgICAgIHZpc2l0ZWRbaV1bal09JzEnOwogICAgIGlmKHg+eikKICAgICB6PXg7CiAgICB9CiAgfQogIHJldHVybiB6Owp9CgoKCmludCBtYWluKCkKewogIGxsaSB0OwogIHNjYW5mKCIlbGxkIiwmdCk7CiAgd2hpbGUodC0tKQogIHsKICAgIGxsaSByLGM7CiAgICBzY2FuZigiJWxsZCVsbGQiLCZjLCZyKTsKICAgIGlucHV0KHIsYyk7CiAgICBsbGkgYW5zPW9wcnRuKHIsYyk7CgogICAgcHJpbnRmKCIlbGxkXG4iLGFucyk7CiAgfQp9Cg==