#include <cstdio>
const int N = 1 << 10, NN = N << 10;
char m[N][N];
int c, dep[NN], q[NN], qh, qt, r, v[NN];
int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};
int bfs(int x, int w, int &midx){
int cd, i, j, maxd = 0;
dep[x] = qh = qt = 0;
q[qt++] = midx = x;
v[midx] = w;
while(qh != qt){
x = q[qh++], i = x >> 10, j = x & 1023;
cd = dep[x];
for(int d = 0; d < 4; ++d){
int ni = i + dx[d], nj = j + dy[d];
if(ni < 0 || nj < 0 || ni >= r || nj >= c) continue;
if(m[ni][nj] == '.' && v[(ni << 10) + nj] != w){
v[q[qt++] = midx = (ni << 10) + nj] = w;
maxd = dep[midx] = cd + 1;
}
}
}
return maxd;
}
int max(int a, int b){ return a > b ? a : b; }
int main(void){
int ans, idx, t;
for(scanf("%d", &t); t-- && scanf("%d %d", &c, &r); ){
ans = 0;
for(int i = 0; i < r; ++i){
scanf("%s", m[i]);
for(int j = 0, k = i << 10; j < c; ++j) v[k + j] = 0;
}
for(int i = 0; i < r; ++i)
for(int j = 0; j < c; ++j)
if(m[i][j] == '.' && !v[(i << 10) + j]){
ans = max(ans, bfs((i << 10) + j, 2, idx));
ans = max(ans, bfs(idx, 1, idx));
}
printf("Maximum rope length is %d.\n", ans);
}
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KCmNvbnN0IGludCBOID0gMSA8PCAxMCwgTk4gPSBOIDw8IDEwOwpjaGFyIG1bTl1bTl07CmludCBjLCBkZXBbTk5dLCBxW05OXSwgcWgsIHF0LCByLCB2W05OXTsKaW50IGR4WzRdID0gey0xLCAxLCAwLCAwfSwgZHlbNF0gPSB7MCwgMCwgLTEsIDF9OwppbnQgYmZzKGludCB4LCBpbnQgdywgaW50ICZtaWR4KXsKCWludCBjZCwgaSwgaiwgbWF4ZCA9IDA7CglkZXBbeF0gPSBxaCA9IHF0ID0gMDsKCXFbcXQrK10gPSBtaWR4ID0geDsKCXZbbWlkeF0gPSB3OwoJd2hpbGUocWggIT0gcXQpewoJCXggPSBxW3FoKytdLCBpID0geCA+PiAxMCwgaiA9IHggJiAxMDIzOwoJCWNkID0gZGVwW3hdOwoJCWZvcihpbnQgZCA9IDA7IGQgPCA0OyArK2QpewoJCQlpbnQgbmkgPSBpICsgZHhbZF0sIG5qID0gaiArIGR5W2RdOwoJCQlpZihuaSA8IDAgfHwgbmogPCAwIHx8IG5pID49IHIgfHwgbmogPj0gYykgY29udGludWU7CgkJCWlmKG1bbmldW25qXSA9PSAnLicgJiYgdlsobmkgPDwgMTApICsgbmpdICE9IHcpewoJCQkJdltxW3F0KytdID0gbWlkeCA9IChuaSA8PCAxMCkgKyBual0gPSB3OwoJCQkJbWF4ZCA9IGRlcFttaWR4XSA9IGNkICsgMTsKCQkJfQoJCX0KCX0KCXJldHVybiBtYXhkOwp9CmludCBtYXgoaW50IGEsIGludCBiKXsgcmV0dXJuIGEgPiBiID8gYSA6IGI7IH0KCmludCBtYWluKHZvaWQpewoJaW50IGFucywgaWR4LCB0OwoJZm9yKHNjYW5mKCIlZCIsICZ0KTsgdC0tICYmIHNjYW5mKCIlZCAlZCIsICZjLCAmcik7ICl7CgkJYW5zID0gMDsKCQlmb3IoaW50IGkgPSAwOyBpIDwgcjsgKytpKXsKCQkJc2NhbmYoIiVzIiwgbVtpXSk7CgkJCWZvcihpbnQgaiA9IDAsIGsgPSBpIDw8IDEwOyBqIDwgYzsgKytqKSB2W2sgKyBqXSA9IDA7CgkJfQoJCWZvcihpbnQgaSA9IDA7IGkgPCByOyArK2kpCgkJCWZvcihpbnQgaiA9IDA7IGogPCBjOyArK2opCgkJCQlpZihtW2ldW2pdID09ICcuJyAmJiAhdlsoaSA8PCAxMCkgKyBqXSl7CgkJCQkJYW5zID0gbWF4KGFucywgYmZzKChpIDw8IDEwKSArIGosIDIsIGlkeCkpOwoJCQkJCWFucyA9IG1heChhbnMsIGJmcyhpZHgsIDEsIGlkeCkpOwoJCQkJfQoJCXByaW50ZigiTWF4aW11bSByb3BlIGxlbmd0aCBpcyAlZC5cbiIsIGFucyk7CgkJCQkJCQoJfQoJcmV0dXJuIDA7Cn0K