#include<iostream>
#include<cstring>
#include<queue>
#include<string>
using namespace std;
# define MAXN 10000
int n,m;
char mapp[MAXN][MAXN];
int Fire[MAXN][MAXN];
int Peo[MAXN][MAXN];
int flag;
int f[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct node
{
int xi;
int yi;
int step;
node() {}
node(int xx,int yy,int zz)
{
xi=xx;
yi=yy;
step=zz;
}
};
int BfsPeo(int t1,int t2)
{
memset(Peo,-1,sizeof(Peo));
Peo[t1][t2]=0;
queue<node>q;
q.push(node(t1,t2,0));
int g=-1;
while(!q.empty())
{
node temp=q.front();
q.pop();
int x=temp.xi;
int y=temp.yi;
int z=temp.step;
if(x==1||x==n||y==1||y==m)
{
g=z+1;
break;
}
for(int i=0; i<4; i++)
{
int xi=x+f[i][0];
int yi=y+f[i][1];
if(xi<=0||xi>n||yi<=0||yi>m)continue;
if(mapp[xi][yi]!='.')continue;
if(Peo[xi][yi]!=-1)continue;
if(Fire[xi][yi]!=-1&&(Peo[x][y]+1>=Fire[xi][yi]))continue;
Peo[xi][yi]=Peo[x][y]+1;
q.push(node(xi,yi,z+1));
}
}
return g;
}
void BfsFire(int t1,int t2)
{
memset(Fire,-1,sizeof(Fire));
Fire[t1][t2]=0;
queue<node>q;
q.push(node(t1,t2,0));
while(!q.empty())
{
node temp=q.front();
q.pop();
int x=temp.xi;
int y=temp.yi;
int z=temp.step;
for(int i=0; i<4; i++)
{
int xi=x+f[i][0];
int yi=y+f[i][1];
if(xi<=0||xi>n||yi<=0||yi>m)continue;
if(Fire[xi][yi]!=-1)continue;
if(mapp[xi][yi]!='.')continue;
Fire[xi][yi]=Fire[x][y]+1;
q.push(node(xi,yi,z+1));
}
}
return ;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
int t1,t2,s1,s2;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>mapp[i][j];
if(mapp[i][j]=='J')
{
t1=i;
t2=j;
}
if(mapp[i][j]=='F')
{
s1=i;
s2=j;
}
}
}
BfsFire(s1,s2);
int e=BfsPeo(t1,t2);
if(e==-1)
cout<<"IMPOSSIBLE"<<endl;
else
cout<<e<<endl;
}
return 0;
}
#include<cstring>
#include<queue>
#include<string>
using namespace std;
# define MAXN 10000
int n,m;
char mapp[MAXN][MAXN];
int Fire[MAXN][MAXN];
int Peo[MAXN][MAXN];
int flag;
int f[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct node
{
int xi;
int yi;
int step;
node() {}
node(int xx,int yy,int zz)
{
xi=xx;
yi=yy;
step=zz;
}
};
int BfsPeo(int t1,int t2)
{
memset(Peo,-1,sizeof(Peo));
Peo[t1][t2]=0;
queue<node>q;
q.push(node(t1,t2,0));
int g=-1;
while(!q.empty())
{
node temp=q.front();
q.pop();
int x=temp.xi;
int y=temp.yi;
int z=temp.step;
if(x==1||x==n||y==1||y==m)
{
g=z+1;
break;
}
for(int i=0; i<4; i++)
{
int xi=x+f[i][0];
int yi=y+f[i][1];
if(xi<=0||xi>n||yi<=0||yi>m)continue;
if(mapp[xi][yi]!='.')continue;
if(Peo[xi][yi]!=-1)continue;
if(Fire[xi][yi]!=-1&&(Peo[x][y]+1>=Fire[xi][yi]))continue;
Peo[xi][yi]=Peo[x][y]+1;
q.push(node(xi,yi,z+1));
}
}
return g;
}
void BfsFire(int t1,int t2)
{
memset(Fire,-1,sizeof(Fire));
Fire[t1][t2]=0;
queue<node>q;
q.push(node(t1,t2,0));
while(!q.empty())
{
node temp=q.front();
q.pop();
int x=temp.xi;
int y=temp.yi;
int z=temp.step;
for(int i=0; i<4; i++)
{
int xi=x+f[i][0];
int yi=y+f[i][1];
if(xi<=0||xi>n||yi<=0||yi>m)continue;
if(Fire[xi][yi]!=-1)continue;
if(mapp[xi][yi]!='.')continue;
Fire[xi][yi]=Fire[x][y]+1;
q.push(node(xi,yi,z+1));
}
}
return ;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
int t1,t2,s1,s2;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>mapp[i][j];
if(mapp[i][j]=='J')
{
t1=i;
t2=j;
}
if(mapp[i][j]=='F')
{
s1=i;
s2=j;
}
}
}
BfsFire(s1,s2);
int e=BfsPeo(t1,t2);
if(e==-1)
cout<<"IMPOSSIBLE"<<endl;
else
cout<<e<<endl;
}
return 0;
}