#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=105,flag[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int n,m,dis[maxn][maxn][4],sx,sy,tx,ty,fx,v,ans;
struct data{ int x,y,fx; } que[1000005];
char map[maxn][maxn];
bool vis[maxn][maxn][4];
bool check(int x,int y){
return x>0&&x<=n&&y>0&&y<=m&&map[x][y]!='.';
}
int getw(int x,int y){
if(x-y==1||x-y==-3) return 35;
if(x-y==-1||x-y==3) return 40;
if(x==y) return 0;
}
int max4(int a,int b,int c,int d){
a=max(a,b);
a=max(a,c);
return a=max(a,d);
}
int main(){
freopen("flying.in","r",stdin);freopen("flying.out","w",stdout);
scanf("%d%d%d\n",&n,&m,&v);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
map[i][j]=getchar();
if(map[i][j]=='N') sx=i, sy=j, fx=0;
if(map[i][j]=='S') sx=i, sy=j, fx=2;
if(map[i][j]=='E') sx=i, sy=j, fx=1;
if(map[i][j]=='W') sx=i, sy=j, fx=3;
if(map[i][j]=='F') tx=i, ty=j;
}
getchar();
}
memset(dis,192,sizeof(dis)); int INF=dis[0][0][0];
int head=0,tail=1;
que[1]=(data){sx,sy,fx};
dis[sx][sy][fx]=v;
while(head<tail){
int x=que[++head].x,y=que[head].y,f=que[head].fx;
vis[x][y][f]=false;
bool pd=true;
for(int i=0;i<=3;i++)if(abs(i-f)!=2){
int xx=x+flag[i][0],yy=y+flag[i][1];
if(check(xx,yy)){
pd=false;
if(max(0,dis[x][y][f]-getw(f,i))+1>dis[xx][yy][i]){
dis[xx][yy][i]=max(0,dis[x][y][f]-getw(f,i))+1;
if(!vis[xx][yy][i]) vis[xx][yy][i]=true, que[++tail]=(data){xx,yy,i};
}
}
}
if(pd)
for(int i=0;i<=3;i++)if(abs(i-f)==2){
int xx=x+flag[i][0],yy=y+flag[i][1];
if(check(xx,yy)){
if(1>dis[xx][yy][i]){
dis[xx][yy][i]=1;
if(!vis[xx][yy][i]) vis[xx][yy][i]=true, que[++tail]=(data){xx,yy,i};
}
}
}
}
ans=max4(dis[tx][ty][0],dis[tx][ty][1],dis[tx][ty][2],dis[tx][ty][3]);
printf("%d",ans==INF?0:ans);
return 0;
}