#include<bits/stdc++.h>
using namespace std;
const int N=40;
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
int n,m,sx,sy,fx,fy,f[N][N][4],ans=0x3f3f3f3f;
char g[N][N];
bool check(int x,int y)
{
if(x<1 || x>n || y<1 || y>m || g[x][y]=='.') return false;
return true;
}
void dfs(int x,int y,int k,int dir)
{
if(k>=f[x][y][dir]) return;
f[x][y][dir]=k;
if(x==fx && y==fy){ans=min(ans,k);return;}
int x1,y1,leftx,lefty,rightx,righty,backx,backy;
x1+=dx[dir],y1+=dy[dir];
rightx+=dx[(dir+1)%4],righty+=dy[(dir+1)%4];
backx+=dx[(dir+2)%4],backy+=dy[(dir+1)%4];
leftx+=dx[(dir+3)%4],lefty+=dy[(dir+3)%4];
if(check(x1,y1)) dfs(x1,y1,k,dir);
if(check(leftx,lefty)) dfs(leftx,lefty,k+1,(dir+3)%4);
if(check(rightx,righty)) dfs(rightx,righty,k+5,(dir+1)%4);
if(!check(x1,y1) && !check(leftx,lefty) && !check(rightx,righty) && check(backx,backy)) dfs(backx,backy,k+10,(dir+2)%4);
}
int main()
{
int dir;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf(" %c",&g[i][j]);
if(g[i][j]=='E') sx=i,sy=j,dir=0;
if(g[i][j]=='S') sx=i,sy=j,dir=1;
if(g[i][j]=='W') sx=i,sy=j,dir=2;
if(g[i][j]=='N') sx=i,sy=j,dir=3;
if(g[i][j]=='F') fx=i,fy=j;
}
memset(f,0x3f,sizeof f);
dfs(sx,sy,0,dir);
printf("%d",ans);
return 0;
}