#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <queue> #include <algorithm> #include <vector> #include <cstring> #include <stack> #include <cctype> #include <utility> #include <map> #include <string> #include <climits> #include <set> #include <string> #include <sstream> #include <utility> #include <ctime> using std::priority_queue; using std::vector; using std::swap; using std::stack; using std::sort; using std::max; using std::min; using std::pair; using std::map; using std::string; using std::cin; using std::cout; using std::set; using std::queue; using std::string; using std::istringstream; using std::make_pair; using std::greater; using std::endl; const int MAXN(1010); const int MAXM(1000010); int fire[MAXN][MAXN]; char mp[MAXN][MAXN]; bool vis[MAXN][MAXN]; int fx[MAXM], fy[MAXM]; int R, C, SX, SY; struct NODE { int x, y, dist; NODE() {} NODE(int tx, int ty, int td): x(tx), y(ty), dist(td) {} }; int move_x[4] = {0, -1, 0, 1}; int move_y[4] = {-1, 0, 1, 0}; void bfs1(int n) { queue<NODE> que; memset(fire+1, -1, sizeof(fire[0])*R); for(int i = 0; i < n; ++i) { que.push(NODE(fx[i], fy[i], 0)); fire[fx[i]][fy[i]] = 0; } NODE cur; while(!que.empty()) { cur = que.front(); que.pop(); for(int i = 0; i < 4; ++i) { int nx = cur.x+move_x[i], ny = cur.y+move_y[i]; if(nx >= 1 && nx <= R && ny >= 1 && ny <= C && mp[nx][ny] != '#' && fire[nx][ny] == -1) { fire[nx][ny] = cur.dist+1; que.push(NODE(nx, ny, cur.dist+1)); } } } } int bfs2(void) { queue<NODE> que; memset(vis+1, 0, sizeof(vis[0])*R); que.push(NODE(SX, SY, 0)); vis[SX][SY] = true; NODE cur; while(!que.empty()) { cur = que.front(); que.pop(); if(cur.x == 1 || cur.y == 1 || cur.x == R || cur.y == C) return cur.dist+1; for(int i = 0; i < 4; ++i) { int nx = cur.x+move_x[i], ny = cur.y+move_y[i]; if(nx >= 1 && nx <= R && ny >= 1 && ny <= C && mp[nx][ny] != '#' && !vis[nx][ny] && (fire[nx][ny] == -1 || cur.dist+1 < fire[nx][ny])) { vis[nx][ny] = true; que.push(NODE(nx, ny, cur.dist+1)); } } } return -1; } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d%d", &R, &C); int count = 0; for(int i = 1; i <= R; ++i) { scanf("%s", mp[i]+1); for(int j = 1; j <= C; ++j) { if(mp[i][j] == 'J') { SX = i; SY = j; } if(mp[i][j] == 'F') { fx[count] = i; fy[count++] = j; } } } bfs1(count); int ans = bfs2(); if(ans == -1) printf("IMPOSSIBLE\n"); else printf("%d\n", ans); } return 0; }