#include<bits/stdc++.h>
using namespace std;
int tx[8] = {0, 0,1,-1, 0,0,-1,1};
int ty[8] = {1,-1,0, 0,-1,1, 0,0};
int sx,sy,stowards;
char mp[110][110];
int vis[110][110];
int ans = INT_MAX;
int n,m;
int dfs(int x,int y,int money,int towards)
{
if(mp[x][y] == 'F')
{
ans = min(ans,money);
return 1;
}
// cout << x << " " << y << " " << money << " " << towards << endl;
bool f = 0;
for(int i = 2;i<6;i++)
{
int nx = x + tx[i];int ny = y + ty[i];
if(nx >= 0 && ny >= 0 && nx < n && ny < m && vis[nx][ny] == 0 && mp[nx][ny] != '.')
{
if(tx[i] == tx[towards] && ty[i] == ty[towards])
{
f = 1;
vis[nx][ny] = 1;
dfs(nx,ny,money,i);
vis[nx][ny] = 0;
}
if(tx[i] == tx[towards+2] && ty[i] == ty[towards+2])
{
f = 1;
vis[nx][ny] = 1;
dfs(nx,ny,money+5,i);
vis[nx][ny] = 0;
}
if(tx[i] == tx[towards-2] && ty[i] == ty[towards-2])
{
f = 1;
vis[nx][ny] = 1;
dfs(nx,ny,money+1,i);
vis[nx][ny] = 0;
}
}
}
if(f == 0)
{
if(towards == 2)
{
vis[x-1][y] = 1;
dfs(x-1,y,money+10,towards+1);
vis[x-1][y] = 0;
}
if(towards == 3)
{
vis[x+1][y] = 1;
dfs(x+1,y,money+10,towards-1);
vis[x+1][y] = 0;
}
if(towards == 4)
{
vis[x][y+1] = 1;
dfs(x,y+1,money+10,towards+1);
vis[x][y+1] = 0;
}
if(towards == 5)
{
vis[x][y-1] = 1;
dfs(x,y-1,money+10,towards-1);
vis[x][y-1] = 0;
}
}
return 0;
}
int main()
{
cin >> n >> m;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
cin >> mp[i][j];
if(mp[i][j] == 'E')
{
sx = i;
sy = j;
stowards = 4;
}
if(mp[i][j] == 'W')
{
sx = i;
sy = j;
stowards = 3;
}
if(mp[i][j] == 'S')
{
sx = i;
sy = j;
stowards = 1;
}
if(mp[i][j] == 'N')
{
sx = i;
sy = j;
stowards = 2;
}
}
}
vis[sx][sy] = 1;
dfs(sx,sy,0,stowards);
cout << ans << endl;
return 0;
}
995