#include<bits/stdc++.h>
//#pragma GCC optimize(2,"Ofast","inline")
using namespace std;
inline void read(int &x){
bool neg=false;
char ch=0;
x=0;
while(ch<'0'||ch>'9'){
if(ch=='-') neg=true;
ch=getchar();
}
if(neg)
while(ch>='0'&&ch<='9') {
x=x*10+('0'-ch);
ch=getchar();
}
else
while(ch>='0'&&ch<='9') {
x=x*10+(ch-'0');
ch=getchar();
}
}
inline void write(int x){
bool neg=false;
if(x<0){
neg=true;
putchar('-');
}
static int sta[40];
int top=0;
do{
sta[top++]=x%10,x/=10;
}while(x);
if(neg)
while(top) putchar('0'-sta[--top]);
else
while(top) putchar('0'+sta[--top]);
}
int t,T,cnt;
int n,m,zx=0x3f3f3f3f;
char x;
int a[105][105];
int f[105][105];
int visx[6]={0,0,-1,0,1,0};
int visy[6]={0,0,0,1,0,-1};
void dfs(int x,int y,int sum,int fx){
if(f[x][y]>0)
{
zx=min(zx,sum);
return;
}
if(a[x][y]==1)
{
int nx=x+visx[fx],ny=y+visy[fx];
if(nx>0&&nx<=n&&ny>0&&ny<=m)
{
f[x+visx[fx]][y+visy[fx]]++;
dfs(x+visx[fx],y+visy[fx],sum,fx);
f[x+visx[fx]][y+visy[fx]]--;
}
else return;
}
else{
for(int i=2;i<=5;i++)
{
int nx=x+visx[i],ny=y+visy[i];
if(a[x][y]==i)
{
if(nx>0&&nx<=n&&ny>0&&ny<=m)
{
f[nx][ny]++;
dfs(nx,ny,sum,i);
f[nx][ny]--;
}
}
else
{
if(nx>0&&nx<=n&&ny>0&&ny<=m)
{
f[nx][ny]++;
dfs(nx,ny,sum+1,i);
f[nx][ny]--;
}
}
}
}
}
signed main(){
read(T);
t=T;
while(T--){
read(n),read(m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>x;
if(x=='.') a[i][j]=1;
if(x=='^') a[i][j]=2;
if(x=='>') a[i][j]=3;
if(x=='v') a[i][j]=4;
if(x=='<') a[i][j]=5;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]!=1)
dfs(i,j,0,a[i][j]);
else cnt++;
}
}
if(cnt==n*m) printf("Case #%d: 0\n",t-T);
else if(zx==0x3f3f3f3f) printf("Case #%d: IMPOISSBLE\n",t-T);
else printf("Case #%d: %d\n",t-T,zx);
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
cnt=0,zx=0x3f3f3f3f;
}
}
全WA