#include<bits/stdc++.h>
using namespace std;
int n,m,ax,ay,bx,by;
bool mp[51][51];
bool ok=1;
bool vis[51][51][10];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
char cx;
struct Node{
int x,y,st,fx;
};
queue<Node> q;
void bfs(){
int f;
if(cx=='E')f=1;
if(cx=='S')f=2;
if(cx=='W')f=3;
if(cx=='N')f=4;
//东E1,南S2,西W3,北N4
q.push({ax,ay,0,f});
while(!q.empty()){
Node fr=q.front();
if(fr.x==bx and fr.y==by){
cout<<fr.st<<endl;
ok=0;
return ;
}
for(int k=0;k<4;k++){
int nx=fr.x+dx[k],ny=fr.y+dy[k];
if(nx>0 and ny>0 and nx<=n and ny<=m and !vis[nx][ny][fr.fx] and !mp[nx][ny]){
vis[nx][ny][fr.fx]=1;
q.push({nx,ny,fr.st+1,fr.fx});
}
nx=fr.x+dx[k]*2,ny=fr.y+dy[k]*2;
if(nx>0 and ny>0 and nx<=n and ny<=m and !vis[nx][ny][fr.fx] and !mp[nx][ny]){
vis[nx][ny][fr.fx]=1;
q.push({nx,ny,fr.st+1,fr.fx});
}
nx=fr.x+dx[k]*3,ny=fr.y+dy[k]*3;
if(nx>0 and ny>0 and nx<=n and ny<=m and !vis[nx][ny][fr.fx] and !mp[nx][ny]){
vis[nx][ny][fr.fx]=1;
q.push({nx,ny,fr.st+1,fr.fx});
}
}
f=fr.fx+1;
if(f==5)f=1;
if(!vis[fr.x][fr.y][f]){
vis[fr.x][fr.y][f]=1;
q.push({fr.x,fr.y,fr.st+1,f});
}
f=fr.fx-1;
if(f==0)f=4;
if(!vis[fr.x][fr.y][f]){
vis[fr.x][fr.y][f]=1;
q.push({fr.x,fr.y,fr.st+1,f});
}
q.pop();
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
cin>>ax>>ay>>bx>>by>>cx;
bfs();
if(ok==1){
cout<<-1<<endl;
}
return 0;
}