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;
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];
return 0;
}