#include <bits/stdc++.h>
using namespace std;
#define ll long long int
const int M = 1e9 + 7;
//google sde-3 18th Sep
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m;
cin >> n >> m;
vector<vector<char>> v(n, vector<char>(m));
vector<vector<int>> minfire_time(n, vector<int>(m, 1e9));
queue<vector<int>> q;
pair<int, int> s;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> v[i][j];
if (v[i][j] == 'F')
{
q.push({i, j, 0});
minfire_time[i][j] = 0;
}
if (v[i][j] == 'S')
{
s.first = i;
s.second = j;
}
}
}
vector<pair<int, int>> direc = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
while (!q.empty())
{
auto it = q.front();
q.pop();
int i = it[0];
int j = it[1];
int time = it[2];
for (auto it : direc)
{
int x = i + it.first;
int y = j + it.second;
if (x >= 0 && y >= 0 && x < n && y < m && v[x][y] != '#' && time + 1 < minfire_time[x][y])
{
minfire_time[x][y] = time + 1;
q.push({x, y, minfire_time[x][y]});
}
}
}
q.push({s.first, s.second, 0});
int ans = -1;
vector<vector<int>> vis(n, vector<int>(m, 0));
vis[s.first][s.second] = 1;
while (!q.empty())
{
auto it = q.front();
q.pop();
int i = it[0];
int j = it[1];
int time = it[2];
if (v[i][j] == 'E')
{
ans = time;
break;
}
for (auto it : direc)
{
int x = i + it.first;
int y = j + it.second;
if (x >= 0 && y >= 0 && x < n && y < m && (v[x][y] == '.' || v[x][y] == 'E') && time + 1 < minfire_time[x][y] && vis[x][y] == 0)
{
vis[x][y] = 1;
q.push({x, y, time + 1});
}
}
}
cout << ans << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nIGludApjb25zdCBpbnQgTSA9IDFlOSArIDc7CgovL2dvb2dsZSBzZGUtMyAxOHRoIFNlcAoKaW50IG1haW4oKQp7Cglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKCWNpbi50aWUoTlVMTCk7CglpbnQgbiwgbTsKCWNpbiA+PiBuID4+IG07Cgl2ZWN0b3I8dmVjdG9yPGNoYXI+PiB2KG4sIHZlY3RvcjxjaGFyPihtKSk7Cgl2ZWN0b3I8dmVjdG9yPGludD4+IG1pbmZpcmVfdGltZShuLCB2ZWN0b3I8aW50PihtLCAxZTkpKTsKCXF1ZXVlPHZlY3RvcjxpbnQ+PiBxOwoJcGFpcjxpbnQsIGludD4gczsKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQoJewoJCWZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKQoJCXsKCQkJY2luID4+IHZbaV1bal07CgkJCWlmICh2W2ldW2pdID09ICdGJykKCQkJewoJCQkJcS5wdXNoKHtpLCBqLCAwfSk7CgkJCQltaW5maXJlX3RpbWVbaV1bal0gPSAwOwoJCQl9CgoJCQlpZiAodltpXVtqXSA9PSAnUycpCgkJCXsKCQkJCXMuZmlyc3QgPSBpOwoJCQkJcy5zZWNvbmQgPSBqOwoJCQl9CgkJfQoJfQoJdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiBkaXJlYyA9IHt7MSwgMH0sIHstMSwgMH0sIHswLCAxfSwgezAsIC0xfX07CgoJd2hpbGUgKCFxLmVtcHR5KCkpCgl7CgkJYXV0byBpdCA9IHEuZnJvbnQoKTsKCQlxLnBvcCgpOwoJCWludCBpID0gaXRbMF07CgkJaW50IGogPSBpdFsxXTsKCQlpbnQgdGltZSA9IGl0WzJdOwoJCWZvciAoYXV0byBpdCA6IGRpcmVjKQoJCXsKCQkJaW50IHggPSBpICsgaXQuZmlyc3Q7CgkJCWludCB5ID0gaiArIGl0LnNlY29uZDsKCgkJCWlmICh4ID49IDAgJiYgeSA+PSAwICYmIHggPCBuICYmIHkgPCBtICYmIHZbeF1beV0gIT0gJyMnICYmIHRpbWUgKyAxIDwgbWluZmlyZV90aW1lW3hdW3ldKQoJCQl7CgkJCQltaW5maXJlX3RpbWVbeF1beV0gPSB0aW1lICsgMTsKCQkJCXEucHVzaCh7eCwgeSwgbWluZmlyZV90aW1lW3hdW3ldfSk7CgkJCX0KCQl9Cgl9CgoJcS5wdXNoKHtzLmZpcnN0LCBzLnNlY29uZCwgMH0pOwoJaW50IGFucyA9IC0xOwoJdmVjdG9yPHZlY3RvcjxpbnQ+PiB2aXMobiwgdmVjdG9yPGludD4obSwgMCkpOwoJdmlzW3MuZmlyc3RdW3Muc2Vjb25kXSA9IDE7Cgl3aGlsZSAoIXEuZW1wdHkoKSkKCXsKCQlhdXRvIGl0ID0gcS5mcm9udCgpOwoJCXEucG9wKCk7CgkJaW50IGkgPSBpdFswXTsKCQlpbnQgaiA9IGl0WzFdOwoJCWludCB0aW1lID0gaXRbMl07CgkJaWYgKHZbaV1bal0gPT0gJ0UnKQoJCXsKCQkJYW5zID0gdGltZTsKCQkJYnJlYWs7CgkJfQoJCWZvciAoYXV0byBpdCA6IGRpcmVjKQoJCXsKCQkJaW50IHggPSBpICsgaXQuZmlyc3Q7CgkJCWludCB5ID0gaiArIGl0LnNlY29uZDsKCgkJCWlmICh4ID49IDAgJiYgeSA+PSAwICYmIHggPCBuICYmIHkgPCBtICYmICh2W3hdW3ldID09ICcuJyB8fCB2W3hdW3ldID09ICdFJykgJiYgdGltZSArIDEgPCBtaW5maXJlX3RpbWVbeF1beV0gJiYgdmlzW3hdW3ldID09IDApCgkJCXsKCQkJCXZpc1t4XVt5XSA9IDE7CgkJCQlxLnB1c2goe3gsIHksIHRpbWUgKyAxfSk7CgkJCX0KCQl9Cgl9CgoJY291dCA8PCBhbnMgPDwgZW5kbDsKCglyZXR1cm4gMDsKfQ==