#include<cstdio>
#include<queue>
using namespace std;
const int Maxn=55;
int n,m,sx,sy,tx,ty;
bool mp[Maxn][Maxn];//地圖
bool vis[Maxn][Maxn][4];//標記狀態有沒有來過
int xx[]={-1,0,1,0};
int yy[]={0,1,0,-1};//往各個方向走
struct Robot{
int x,y,s,d;//座標,時間,方向
};
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int t;
scanf("%d",&t);
if(t){
mp[i][j]=mp[i-1][j]=mp[i][j-1]=mp[i-1][j-1]=1;//將障礙物放到地圖上
}
}
}
queue< Robot > Q;
char tt;
scanf("%d %d %d %d %c",&sx,&sy,&tx,&ty,&tt);
Robot t1;
t1.x=sx;t1.y=sy;t1.s=0;//打包起始狀態
if(tt=='N')t1.d = 0;
if( tt=='E')t1.d=1;
if(tt=='S')t1.d=2;
if(tt=='W')t1.d=3;
Q.push(t1);//將起始狀態壓入
while(!Q.empty()){
t1 = Q.front();
vis[t1.x][t1.y][t1.d] = 1;//標記這個點來過
if ( t1.x == tx && t1.y == ty){//到了終點
printf("%d",t1.s);
return 0;
}
Robot t = t1;
t.s ++;//時間+1
t.d = (t.d+1)%4;//往左轉
if( !vis[t.x][t.y][t.d]){
Q.push(t);
}
t.d=(t.d+2)%4;//往右轉
if( !vis[t.x][t.y][t.d]){
Q.push(t);
}
t.d=t1.d;
t.x+=xx[t.d];
t.y+=yy[t.d];
if(t.x>=1&&t.x<n&&t.y>=1&&t.y<m&&!vis[t.x][t.y][t.d]&&!mp[t.x][t.y]){//向前一步
Q.push(t);
t.x+=xx[t.d];
t.y+=yy[t.d];
if(t.x>=1&&t.x<n&&t.y>=1&&t.y<m&&!vis[t.x][t.y][t.d]&&!mp[t.x][t.y]){//向前兩步
Q.push(t);
t.x+=xx[t.d];
t.y+=yy[t.d];
if(t.x>=1&&t.x<n&&t.y>=1&&t.y<m&&!vis[t.x][t.y][t.d]&&!mp[t.x][t.y]){//向前三步
Q.push(t);
}
}
}
Q.pop();//這個點完成任務
}
printf("-1");
return 0;
}