#include<iostream>
#include<cstring>
using namespace std;
int h,w,dis[35][35][4],sx,sy,ex,ey;
char a[35][35];
const int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0},turnl[4]={2,3,1,0},turnr[4]={3,2,0,1},turnd[4]={1,0,3,2};
bool ok(int x,int y){
return x>=1&&x<=h&&y>=1&&y<=w&&a[x][y]!='.';
}
void dfs(int x,int y,int fx,int sum){
if(sum>dis[x][y][fx])return;
dis[x][y][fx]=sum;
if(ok(x+dx[fx],y+dy[fx])){
dfs(x+dx[fx],y+dy[fx],fx,sum);
}
bool flag=0;
if(ok(x+dx[turnl[fx]],y+dy[turnl[fx]])){
dfs(x+dx[turnl[fx]],y+dy[turnl[fx]],turnl[fx],sum+1);
flag=1;
}
if(ok(x+dx[turnr[fx]],y+dy[turnr[fx]])){
dfs(x+dx[turnr[fx]],y+dy[turnr[fx]],turnr[fx],sum+5);
flag=1;
}
if(flag==0&&ok(x+dx[turnd[fx]],y+dy[turnd[fx]])!='#'){
dfs(x+dx[turnd[fx]],y+dy[turnd[fx]],turnd[fx],sum+10);
}
}
int main(){
cin>>h>>w;
char fx;
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
cin>>a[i][j];
if(a[i][j]=='E')fx=0,sx=i,sy=j;
if(a[i][j]=='W')fx=1,sx=i,sy=j;
if(a[i][j]=='N')fx=2,sx=i,sy=j;
if(a[i][j]=='S')fx=3,sx=i,sy=j;
if(a[i][j]=='F')ex=i,ey=j;
}
}
memset(dis,0x3f,sizeof(dis));
dfs(sx,sy,fx,0);
int ans=0x3f3f3f3f;
for(int i=0;i<4;i++){
ans=min(ans,dis[h][w][i]);
}
cout<<ans;
return 0;
}