#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<string> grid(n);
for (int i = 0; i < n; i++) cin >> grid[i];
int dr[] = {-1, 0, 1, 0};
int dc[] = {0, 1, 0, -1};
vector<vector<int>> dist(n, vector<int>(m, INT_MAX));
priority_queue<tuple<int,int,int>, vector<tuple<int,int,int>>, greater<>> pq;
dist[0][0] = 0;
pq.push({0, 0, 0});
while (!pq.empty()) {
auto [d, r, c] = pq.top(); pq.pop();
if (d > dist[r][c]) continue;
if (r == n-1 && c == m-1) break;
if (grid[r][c] == 'X') continue;
int curDir;
if (grid[r][c] == 'N') curDir = 0;
else if (grid[r][c] == 'E') curDir = 1;
else if (grid[r][c] == 'S') curDir = 2;
else curDir = 3;
for (int dir = 0; dir < 4; dir++) {
int nr = r + dr[dir];
int nc = c + dc[dir];
if (nr < 0 || nr >= n || nc < 0 || nc >= m) continue;
int w = (dir - curDir + 4) % 4;
if (dist[r][c] + w < dist[nr][nc]) {
dist[nr][nc] = dist[r][c] + w;
pq.push({dist[nr][nc], nr, nc});
}
}
}
if (dist[n-1][m-1] == INT_MAX)
cout << -1 << "\n";
else
cout << dist[n-1][m-1] << "\n";
return 0;
}