#include<bits/stdc++.h>
using namespace std;
# define INF 0x3f3f3f3f
char a[105][105];
int f[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
int visited[105][105];
int n,m;
int FireNum;
struct node
{
int xi,yi;
int step;
node() {}
node(int xx,int yy,int zz)
{
xi=xx;
yi=yy;
step=zz;
}
} q[10001];
bool Judge1(int xi,int yi)
{
if(xi>=0&&xi<n&&yi>=0&&yi<m&&a[xi][yi]=='#'&&visited[xi][yi]==0)
{
return true;
}
return false;
}
int bfs(node q1,node q2)
{
int depth=0;
queue<node>q;
while(!q.empty()) q.pop();
q.push(q1);
q.push(q2);
int g=1;
while(!q.empty())
{
node temp1=q.front();q.pop();
int x1=temp1.xi;
int y1=temp1.yi;
if(visited[x1][y1]==1)continue;
depth=temp1.step;
for(int i=0; i<4; i++)
{
int x2=x1+f[i][0];
int y2=y1+f[i][1];
if(Judge1(x2,y2))
{
visited[x2][y2]=1;
q.push(node(x2,y2,temp1.step+1));
}
}
}
return depth;
}
bool Judge2()
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(a[i][j]=='#'&&visited[i][j]==1)
return false;
}
}
return true;
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(visited,0,sizeof(visited));
cin>>n>>m;
int num=1;
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
cin>>a[i][j];
if(a[i][j]=='#')
{
q[num].xi=i;
q[num].yi=j;
q[num++].step=0;
}
}
}
int flag=1;
int minn=INF;
int r=INF;
for(int i=1; i<num; i++)
{
for(int j=i; j<num; j++)
{
int temp=min(bfs(q[i],q[j]),r);
if(Judge2())
{
flag=0;
minn=min(minn,temp);
}
}
}
int s=1;
cout<<"Case "<<s++<<": ";
if(flag==0)
cout<<minn<<endl;
else
cout<<-1<<endl;
}
return 0;
}
using namespace std;
# define INF 0x3f3f3f3f
char a[105][105];
int f[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
int visited[105][105];
int n,m;
int FireNum;
struct node
{
int xi,yi;
int step;
node() {}
node(int xx,int yy,int zz)
{
xi=xx;
yi=yy;
step=zz;
}
} q[10001];
bool Judge1(int xi,int yi)
{
if(xi>=0&&xi<n&&yi>=0&&yi<m&&a[xi][yi]=='#'&&visited[xi][yi]==0)
{
return true;
}
return false;
}
int bfs(node q1,node q2)
{
int depth=0;
queue<node>q;
while(!q.empty()) q.pop();
q.push(q1);
q.push(q2);
int g=1;
while(!q.empty())
{
node temp1=q.front();q.pop();
int x1=temp1.xi;
int y1=temp1.yi;
if(visited[x1][y1]==1)continue;
depth=temp1.step;
for(int i=0; i<4; i++)
{
int x2=x1+f[i][0];
int y2=y1+f[i][1];
if(Judge1(x2,y2))
{
visited[x2][y2]=1;
q.push(node(x2,y2,temp1.step+1));
}
}
}
return depth;
}
bool Judge2()
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(a[i][j]=='#'&&visited[i][j]==1)
return false;
}
}
return true;
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(visited,0,sizeof(visited));
cin>>n>>m;
int num=1;
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
cin>>a[i][j];
if(a[i][j]=='#')
{
q[num].xi=i;
q[num].yi=j;
q[num++].step=0;
}
}
}
int flag=1;
int minn=INF;
int r=INF;
for(int i=1; i<num; i++)
{
for(int j=i; j<num; j++)
{
int temp=min(bfs(q[i],q[j]),r);
if(Judge2())
{
flag=0;
minn=min(minn,temp);
}
}
}
int s=1;
cout<<"Case "<<s++<<": ";
if(flag==0)
cout<<minn<<endl;
else
cout<<-1<<endl;
}
return 0;
}