#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll n,m;
cin>>n>>m;
vector<vector<char>> V(n,vector<char>(m));
vector<vector<pair<ll,ll>>> adj(n*m);
map<char,ll> value;
value['S']=0;
value['E']=3;
value['N']=2;
value['W']=1;
value['X']=1e17;
ll nodo=0;
for(int i=0;i<n;i++){
string s;
cin>>s;
for(int j=0;j<m;j++){
V[i][j]=s[j];
if(V[i][j]=='X'){
nodo++;
continue;
}
if(i>0){
ll distancia=(2-value[V[i][j]]+4)%4;
adj[nodo].push_back({nodo-m,distancia});
}
if(j>0){
ll distancia=(1-value[V[i][j]]+4)%4;
adj[nodo].push_back({nodo-1,distancia});
}
if(i<n-1){
ll distancia=(0-value[V[i][j]]+4)%4;
adj[nodo].push_back({nodo+m,distancia});
}
if(j<m-1){
ll distancia=(3-value[V[i][j]]+4)%4;
adj[nodo].push_back({nodo+1,distancia});
}
nodo++;
}
}
vector<ll> dist(n*m,1e17);
dist[0]=0;
priority_queue<pair<ll,ll>,vector<pair<ll,ll>>,greater<pair<ll,ll>>> Q;
Q.push({0,0});
while(!Q.empty()){
ll node=Q.top().second;
ll w=Q.top().first;
Q.pop();
if(w>dist[node]){
continue;
}
for(auto x:adj[node]){
ll peso=x.second;
ll goin=x.first;
if(dist[node]+peso<dist[goin]){
dist[goin]=dist[node]+peso;
Q.push({dist[goin],goin});
}
}
}
if(dist[n*m-1]==1e17){
dist[n*m-1]=-1;
}
cout<<dist[n*m-1]<<endl;
}