#include<bits/stdc++.h>
#define int long long
#define end '\n'
#define rep(i, s, t) for(int i = (s); i <= (t); i++)
using namespace std;
const int N = 35;
int n, m;
char a[N][N];
int f, sx, sy, mini = 1e9;
bool vis[N][N];
void dfs(int x, int y, int f, int sum){
if(x < 1 || x > n || y < 1 || y > m || vis[x][y] || a[x][y] == '.'){
return ;
}
vis[x][y] = true;
if(a[x][y] == 'F'){
mini = min(mini, sum);
return ;
}
if(f == 1){
if(a[x][y + 1] == '.' && a[x - 1][y] == '.' && a[x + 1][y] == '.'){
dfs(x, y - 1, 2, sum + 10);
}
}
if(f == 2){
if(a[x][y - 1] == '.' && a[x + 1][y] == '.' && a[x - 1][y] == '.'){
dfs(x, y + 1, 1, sum + 10);
}
}
if(f == 3){
if(a[x - 1][y] == '.' && a[x][y - 1] == '.' && a[x][y + 1] == '.'){
dfs(x + 1, y, 4, sum + 10);
}
}
if(f == 4){
if(a[x + 1][y] == '.' && a[x][y + 1] == '.' && a[x][y - 1] == '.'){
dfs(x - 1, y, 3, sum + 10);
}
}
if(f == 1){
dfs(x, y + 1, f, sum);
}
else if(f == 2){
dfs(x, y - 1, f, sum);
}
else if(f == 3){
dfs(x - 1, y, f, sum);
}
else if(f == 4){
dfs(x + 1, y, f, sum);
}
if(f == 1){
dfs(x - 1, y, 3, sum + 1);
}
else if(f == 2){
dfs(x + 1, y, 4, sum + 1);
}
else if(f == 3){
dfs(x, y - 1, 2, sum + 1);
}
else if(f == 4){
dfs(x, y + 1, 1, sum + 1);
}
if(f == 1){
dfs(x + 1, y, 4, sum + 5);
}
else if(f == 2){
dfs(x - 1, y, 3, sum + 5);
}
else if(f == 3){
dfs(x, y + 1, 1, sum + 5);
}
else if(f == 4){
dfs(x, y - 1, 2, sum + 5);
}
vis[x][y] = false;
}
void Solve(){
cin >> n >> m;
rep(i, 1, n){
rep(j, 1, m){
cin >> a[i][j];
if(a[i][j] != '.' && a[i][j] != '#' && a[i][j] != 'F'){
f = (a[i][j] == 'E' ? 1 : (a[i][j] == 'W' ? 2 : (a[i][j] == 'N' ? 3 : 4)));
sx = i, sy = j;
}
}
}
dfs(sx, sy, f, 0);
cout << mini - 2 << endl;
}
signed main(){
Solve();
return 0;
}