#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
#define F first
#define S second
#define loop(a,n) for(int i=a; i<=n ; i++)
#define TIME (1.0 * clock() / CLOCKS_PER_SEC)
#define NAME ""
using namespace std;
const int maxx = 1005;
int n, m;
char a[maxx][maxx];
int dist[maxx][maxx];
bool visited[maxx][maxx];
pair<int, int> start, endp;
int dx[8] = {-1, 1, 0, 0, -1, -1, 1, 1};
int dy[8] = {0, 0, -1, 1, -1, 1, -1, 1};
bool check(int x, int y) {
return x >= 0 && x < n && y >= 0 && y < m && a[x][y] != '#' && !visited[x][y];
}
int bfs(pair<int, int> src, pair<int, int> dest) {
queue<pair<int, int>> q;
q.push(src);
visited[src.F][src.S] = true;
dist[src.F][src.S] = 0;
while (!q.empty()) {
pair<int, int> u = q.front(); q.pop();
int x = u.F, y = u.S;
if (u == dest) return dist[x][y];
for (int i = 0; i < 8; ++i) {
int nx = x + dx[i], ny = y + dy[i];
if (check(nx, ny)) {
visited[nx][ny] = true;
dist[nx][ny] = dist[x][y] + 1;
q.push({nx, ny});
}
}
}
return -1;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
//freopen(NAME".INP","r",stdin);
//freopen(NAME".OUT","w",stdout);
cin >> n >> m;
for (int i = 0; i < n; ++i) {
cin >> a[i];
for (int j = 0; j < m; ++j) {
if (a[i][j] == 'S') start = {i, j};
if (a[i][j] == 'E') endp = {i, j};
}
}
cout << bfs(start, endp);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGVuZGwgIlxuIgojZGVmaW5lIEYgZmlyc3QKI2RlZmluZSBTIHNlY29uZAojZGVmaW5lIGxvb3AoYSxuKSBmb3IoaW50IGk9YTsgaTw9biA7IGkrKykKI2RlZmluZSBUSU1FICgxLjAgKiBjbG9jaygpIC8gQ0xPQ0tTX1BFUl9TRUMpCiNkZWZpbmUgTkFNRSAiIgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgbWF4eCA9IDEwMDU7CmludCBuLCBtOwpjaGFyIGFbbWF4eF1bbWF4eF07CmludCBkaXN0W21heHhdW21heHhdOwpib29sIHZpc2l0ZWRbbWF4eF1bbWF4eF07CnBhaXI8aW50LCBpbnQ+IHN0YXJ0LCBlbmRwOwoKaW50IGR4WzhdID0gey0xLCAxLCAwLCAwLCAtMSwgLTEsIDEsIDF9OwppbnQgZHlbOF0gPSB7MCwgMCwgLTEsIDEsIC0xLCAxLCAtMSwgMX07CmJvb2wgY2hlY2soaW50IHgsIGludCB5KSB7CiAgICByZXR1cm4geCA+PSAwICYmIHggPCBuICYmIHkgPj0gMCAmJiB5IDwgbSAmJiBhW3hdW3ldICE9ICcjJyAmJiAhdmlzaXRlZFt4XVt5XTsKfQppbnQgYmZzKHBhaXI8aW50LCBpbnQ+IHNyYywgcGFpcjxpbnQsIGludD4gZGVzdCkgewogICAgcXVldWU8cGFpcjxpbnQsIGludD4+IHE7CiAgICBxLnB1c2goc3JjKTsKICAgIHZpc2l0ZWRbc3JjLkZdW3NyYy5TXSA9IHRydWU7CiAgICBkaXN0W3NyYy5GXVtzcmMuU10gPSAwOwogICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICBwYWlyPGludCwgaW50PiB1ID0gcS5mcm9udCgpOyBxLnBvcCgpOwogICAgICAgIGludCB4ID0gdS5GLCB5ID0gdS5TOwogICAgICAgIGlmICh1ID09IGRlc3QpIHJldHVybiBkaXN0W3hdW3ldOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgKytpKSB7CiAgICAgICAgICAgIGludCBueCA9IHggKyBkeFtpXSwgbnkgPSB5ICsgZHlbaV07CiAgICAgICAgICAgIGlmIChjaGVjayhueCwgbnkpKSB7CiAgICAgICAgICAgICAgICB2aXNpdGVkW254XVtueV0gPSB0cnVlOwogICAgICAgICAgICAgICAgZGlzdFtueF1bbnldID0gZGlzdFt4XVt5XSArIDE7CiAgICAgICAgICAgICAgICBxLnB1c2goe254LCBueX0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOyAKfQoKaW50IG1haW4oKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIC8vZnJlb3BlbihOQU1FIi5JTlAiLCJyIixzdGRpbik7CiAgICAvL2ZyZW9wZW4oTkFNRSIuT1VUIiwidyIsc3Rkb3V0KTsKICAgIGNpbiA+PiBuID4+IG07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGNpbiA+PiBhW2ldOwogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICAgIGlmIChhW2ldW2pdID09ICdTJykgc3RhcnQgPSB7aSwgan07CiAgICAgICAgICAgIGlmIChhW2ldW2pdID09ICdFJykgZW5kcCA9IHtpLCBqfTsKICAgICAgICB9CiAgICB9CiAgICBjb3V0IDw8IGJmcyhzdGFydCwgZW5kcCk7CiAgICByZXR1cm4gMDsKfQo=