#include <bits/stdc++.h>
using namespace std;
// debug:
#ifndef ONLINE_JUDGE
#include "D:\Problem Solving\Imp files - PDFs - Books\debug\debug.hpp"
#else
#define debug(...)
#define debug_itr(...)
#define debug_bits(...)
#endif
const double PI = acos(-1.0);
const double EPS = 1e-8; /// WARNING: problem dependent !!!
typedef long long ll;
typedef vector< vector<int> > GRAPH;
#define Saeed_fast ios_base::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
#define endl '\n' // because '\n' is faster while compiling, and 'endl' is easier for coding ;)
#define all(c) (c).begin(), (c).end()
#define all1(a, n) ((a).begin() + 1), ((a).begin() + (n) + 1)
#define for1(iter, n) for (int (iter) = 1; (iter) <= (n); ++(iter))
inline void yes_or_no(bool ok) { cout << (ok? "YES\n" : "NO\n"); }
inline ll sum_to_n(ll n) { return n*(n + 1)/2; }
// double compare
// returns: 0 if almost equal, 1 if `a` greater, -1 if `b` greater
inline int dcmp (double a, double b) { return fabs(a - b) <= EPS? 0 : a > b? 1 : -1; }
/////
int n, m;
vector<string> grid;
pair<int, int> s, f;
vector< vector<int> > moves;
struct cell { int i, j; };
/// save
int dr[8] = {-1, 1, 0, 0, 1, 1, -1, -1};
int dc[8] = {0, 0, -1, 1, 1, -1, 1, -1};
/// save
bool is_valid(int i, int j) {
return (i >= 0 and i < n) and (j >= 0 and j < m);
}
void bfs() {
queue<cell> breadth;
vector< vector<bool> > added(n, vector<bool>(m));
cell start = {s.first, s.second};
breadth.push(start);
added[start.i][start.j] = true;
for (int level = 0, siz = breadth.size(); !breadth.empty(); ++level, siz = breadth.size()) {
while (siz--) { // process only the current level
auto cur = breadth.front(); /// save
breadth.pop();
// get neighbors
for (int i = 0; i < 8; ++i) {
int ni = cur.i + dr[i], nj = cur.j + dc[i];
// move the queen to the end of the direction
int val = moves[cur.i][cur.j] + 1;
while (is_valid(ni, nj) and grid[ni][nj] != 'X' and !(added[ni][nj] and moves[ni][nj] < val)) {
moves[ni][nj] = val;
breadth.push({ni, nj});
added[ni][nj] = true;
ni += dr[i], nj += dc[i];
}
}
}
}
}
void solve(int TC) {
cin >> n >> m;
grid = vector<string>(n);
for (int i = 0; i < n; ++i) {
cin >> grid[i];
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (grid[i][j] == 'S')
s = {i, j};
else if (grid[i][j] == 'F')
f = {i, j};
}
}
moves = vector< vector<int> >(n, vector<int>(m, 100000));
moves[s.first][s.second] = 0;
bfs();
int ans = moves[f.first][f.second] == 100000? -1 : moves[f.first][f.second];
cout << ans << endl;
}
int main()
{
Saeed_fast;
int TC = 1;
cin >> TC;
for (int test = 1; test <= TC; ++test) {
solve(test);
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBkZWJ1ZzoKI2lmbmRlZiBPTkxJTkVfSlVER0UKI2luY2x1ZGUgIkQ6XFByb2JsZW0gU29sdmluZ1xJbXAgZmlsZXMgLSBQREZzIC0gQm9va3NcZGVidWdcZGVidWcuaHBwIgojZWxzZQojZGVmaW5lIGRlYnVnKC4uLikKI2RlZmluZSBkZWJ1Z19pdHIoLi4uKQojZGVmaW5lIGRlYnVnX2JpdHMoLi4uKQojZW5kaWYKCmNvbnN0IGRvdWJsZSBQSSA9IGFjb3MoLTEuMCk7CmNvbnN0IGRvdWJsZSBFUFMgPSAxZS04OyAvLy8gV0FSTklORzogcHJvYmxlbSBkZXBlbmRlbnQgISEhCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiB2ZWN0b3I8IHZlY3RvcjxpbnQ+ID4gR1JBUEg7CgojZGVmaW5lIFNhZWVkX2Zhc3QgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSksY2luLnRpZShOVUxMKSxjb3V0LnRpZShOVUxMKQojZGVmaW5lIGVuZGwgJ1xuJyAgLy8gYmVjYXVzZSAnXG4nIGlzIGZhc3RlciB3aGlsZSBjb21waWxpbmcsIGFuZCAnZW5kbCcgaXMgZWFzaWVyIGZvciBjb2RpbmcgOykKI2RlZmluZSBhbGwoYykgKGMpLmJlZ2luKCksIChjKS5lbmQoKQojZGVmaW5lIGFsbDEoYSwgbikgKChhKS5iZWdpbigpICsgMSksICgoYSkuYmVnaW4oKSArIChuKSArIDEpCiNkZWZpbmUgZm9yMShpdGVyLCBuKSBmb3IgKGludCAoaXRlcikgPSAxOyAoaXRlcikgPD0gKG4pOyArKyhpdGVyKSkKCmlubGluZSB2b2lkIHllc19vcl9ubyhib29sIG9rKSB7IGNvdXQgPDwgKG9rPyAiWUVTXG4iIDogIk5PXG4iKTsgfQppbmxpbmUgbGwgc3VtX3RvX24obGwgbikgeyByZXR1cm4gbioobiArIDEpLzI7IH0KLy8gZG91YmxlIGNvbXBhcmUKLy8gcmV0dXJuczogMCBpZiBhbG1vc3QgZXF1YWwsIDEgaWYgYGFgIGdyZWF0ZXIsIC0xIGlmIGBiYCBncmVhdGVyCmlubGluZSBpbnQgZGNtcCAoZG91YmxlIGEsIGRvdWJsZSBiKSB7IHJldHVybiBmYWJzKGEgLSBiKSA8PSBFUFM/IDAgOiBhID4gYj8gMSA6IC0xOyB9CgovLy8vLwoKaW50IG4sIG07CnZlY3RvcjxzdHJpbmc+IGdyaWQ7CnBhaXI8aW50LCBpbnQ+IHMsIGY7CnZlY3RvcjwgdmVjdG9yPGludD4gPiBtb3ZlczsKCnN0cnVjdCBjZWxsIHsgaW50IGksIGo7IH07CgovLy8gc2F2ZQppbnQgZHJbOF0gPSB7LTEsIDEsIDAsIDAsIDEsIDEsIC0xLCAtMX07CmludCBkY1s4XSA9IHswLCAwLCAtMSwgMSwgMSwgLTEsIDEsIC0xfTsKCi8vLyBzYXZlCmJvb2wgaXNfdmFsaWQoaW50IGksIGludCBqKSB7CiAgICByZXR1cm4gKGkgPj0gMCBhbmQgaSA8IG4pIGFuZCAoaiA+PSAwIGFuZCBqIDwgbSk7Cn0Kdm9pZCBiZnMoKSB7CiAgICBxdWV1ZTxjZWxsPiBicmVhZHRoOwogICAgdmVjdG9yPCB2ZWN0b3I8Ym9vbD4gPiBhZGRlZChuLCB2ZWN0b3I8Ym9vbD4obSkpOwoKICAgIGNlbGwgc3RhcnQgPSB7cy5maXJzdCwgcy5zZWNvbmR9OwogICAgYnJlYWR0aC5wdXNoKHN0YXJ0KTsKICAgIGFkZGVkW3N0YXJ0LmldW3N0YXJ0LmpdID0gdHJ1ZTsKCiAgICBmb3IgKGludCBsZXZlbCA9IDAsIHNpeiA9IGJyZWFkdGguc2l6ZSgpOyAhYnJlYWR0aC5lbXB0eSgpOyArK2xldmVsLCBzaXogPSBicmVhZHRoLnNpemUoKSkgewogICAgICAgIHdoaWxlIChzaXotLSkgeyAvLyBwcm9jZXNzIG9ubHkgdGhlIGN1cnJlbnQgbGV2ZWwKICAgICAgICAgICAgYXV0byBjdXIgPSBicmVhZHRoLmZyb250KCk7IC8vLyBzYXZlCiAgICAgICAgICAgIGJyZWFkdGgucG9wKCk7CgogICAgICAgICAgICAvLyBnZXQgbmVpZ2hib3JzCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgKytpKSB7CiAgICAgICAgICAgICAgICBpbnQgbmkgPSBjdXIuaSArIGRyW2ldLCBuaiA9IGN1ci5qICsgZGNbaV07CgogICAgICAgICAgICAgICAgLy8gbW92ZSB0aGUgcXVlZW4gdG8gdGhlIGVuZCBvZiB0aGUgZGlyZWN0aW9uCiAgICAgICAgICAgICAgICBpbnQgdmFsID0gbW92ZXNbY3VyLmldW2N1ci5qXSArIDE7CiAgICAgICAgICAgICAgICB3aGlsZSAoaXNfdmFsaWQobmksIG5qKSBhbmQgZ3JpZFtuaV1bbmpdICE9ICdYJyBhbmQgIShhZGRlZFtuaV1bbmpdIGFuZCBtb3Zlc1tuaV1bbmpdIDwgdmFsKSkgewogICAgICAgICAgICAgICAgICAgIG1vdmVzW25pXVtual0gPSB2YWw7CiAgICAgICAgICAgICAgICAgICAgYnJlYWR0aC5wdXNoKHtuaSwgbmp9KTsKICAgICAgICAgICAgICAgICAgICBhZGRlZFtuaV1bbmpdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBuaSArPSBkcltpXSwgbmogKz0gZGNbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnZvaWQgc29sdmUoaW50IFRDKSB7CiAgICBjaW4gPj4gbiA+PiBtOwogICAgZ3JpZCA9IHZlY3RvcjxzdHJpbmc+KG4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBjaW4gPj4gZ3JpZFtpXTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICAgICAgaWYgKGdyaWRbaV1bal0gPT0gJ1MnKQogICAgICAgICAgICAgICAgcyA9IHtpLCBqfTsKICAgICAgICAgICAgZWxzZSBpZiAoZ3JpZFtpXVtqXSA9PSAnRicpCiAgICAgICAgICAgICAgICBmID0ge2ksIGp9OwogICAgICAgIH0KICAgIH0KCiAgICBtb3ZlcyA9IHZlY3RvcjwgdmVjdG9yPGludD4gPihuLCB2ZWN0b3I8aW50PihtLCAxMDAwMDApKTsKICAgIG1vdmVzW3MuZmlyc3RdW3Muc2Vjb25kXSA9IDA7CiAgICBiZnMoKTsKCiAgICBpbnQgYW5zID0gbW92ZXNbZi5maXJzdF1bZi5zZWNvbmRdID09IDEwMDAwMD8gLTEgOiBtb3Zlc1tmLmZpcnN0XVtmLnNlY29uZF07CiAgICBjb3V0IDw8IGFucyA8PCBlbmRsOwp9CgppbnQgbWFpbigpCnsKICAgIFNhZWVkX2Zhc3Q7CgogICAgaW50IFRDID0gMTsKICAgIGNpbiA+PiBUQzsKICAgIGZvciAoaW50IHRlc3QgPSAxOyB0ZXN0IDw9IFRDOyArK3Rlc3QpIHsKICAgICAgICBzb2x2ZSh0ZXN0KTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==