#include<bits/stdc++.h>
using namespace std;

int main()
{
    int m, n;
    cin >> m >> n;
    vector<vector<char>> v(m, vector<char>(n, 0));
    int sx, sy, ex, ey;
    for(int i=0; i<m; i++){
        string t;
        cin>>t;
        for(int j=0; j<n; j++){
            v[i][j] = t[j];
            if(v[i][j]=='S'){
                sx = i;
                sy = j;
            }
            if(v[i][j]=='E'){
                ex = i;
                ey = j;
            }
        }
    }
    vector<int> distance(m*n, INT_MAX);
    distance[sx*n+sy] = 0;
    vector<int> visited(m*n, 0);
    visited[sx*n+sy] = 1;
    typedef tuple<int,int,int> tp;
    priority_queue<tp, vector<tp>, greater<tp>> q;
    vector<pair<int, int>> direction = {{0,1},{1,0},{0,-1},{-1,0}};
    //先走一遍上下左右
    for(int i=0; i<4; i++){
        int nx = sx + direction[i].first;
        int ny = sy + direction[i].second;
        if(nx<0 || nx>=m || ny<0 || ny>=n || v[nx][ny]=='X')
            continue;
        distance[nx*n+ny] = 1;
        q.push({1, nx*n+ny, i}); 
    }
    while(!q.empty()){
        auto cur = q.top();
        int cur_distance = get<0>(cur);
        int cur_pos = get<1>(cur);
        int cur_direction = get<2>(cur);
        q.pop();
        if(visited[cur_pos]==1)
            continue;
        visited[cur_pos] = 1;
        int cur_x = cur_pos/n;
        int cur_y = cur_pos%n;
        for(int i=0; i<4; i++){
            int nx = cur_x + direction[i].first;
            int ny = cur_y + direction[i].second;
            if(nx<0 || nx>=m || ny<0 || ny>=n || v[nx][ny]=='X')
                continue;
            //计算nx,ny位置处的花费
            int cost = (cur_direction%2 == i%2) ? 1 : 2;
            int n_distance = cur_distance + cost; 
            if(n_distance < distance[nx*n+ny]){
                distance[nx*n+ny] = n_distance;
                q.emplace(n_distance, nx*n+ny, i);
            }
        }
    }
    int ans = (distance[ex*n+ey]==INT_MAX)?-1:distance[ex*n+ey];
    cout << ans;
    return 0;
}