using namespace std;
int N,M;
int s[60][60];
int t[60][60];
int vx[5]={0,0,-1,0,1},vy[5]={0,-1,0,1,0};
int xx1,xx2,yy1,yy2;
char face;
void dfs(int ax,int ay,int f,int ti){
t[ax][ay]=ti;
if(ax==xx2&&ay==yy2) return;
if(s[ax+vx[f]][ay+vy[f]]!=1&&ax+vx[f]>=1&&ax+vx[f]<=N&&ay+vy[f]>=1&&ay+vy[f]<=M){
if(t[ax+vx[f]][ay+vy[f]]<t[ax][ay]+1) return;
dfs(ax+vx[f],ay+vy[f],f,ti+1);
} //creep 向前
if(s[ax+2*vx[f]][ay+2*vy[f]]!=1&&ax+2*vx[f]>=1&&ax+2*vx[f]<=N&&ay+2*vy[f]>=1&&ay+2*vy[f]<=M){
if(t[ax+2*vx[f]][ay+2*vy[f]]<t[ax][ay]+1) return;
dfs(ax+2*vx[f],ay+2*vy[f],f,ti+1);
} //walk 向前
if(s[ax+3*vx[f]][ay+3*vy[f]]!=1&&ax+3*vx[f]>=1&&ax+3*vx[f]<=N&&ay+3*vy[f]>=1&&ay+3*vy[f]<=M){
if(t[ax+3*vx[f]][ay+3*vy[f]]<t[ax][ay]+1) return;
dfs(ax+3*vx[f],ay+3*vy[f],f,ti+1);
} //run 向前
f++;
if(f==5) f=1;
if(s[ax+vx[f]][ay+vy[f]]!=1&&ax+vx[f]>=1&&ax+vx[f]<=N&&ay+vy[f]>=1&&ay+vy[f]<=M){
if(t[ax+vx[f]][ay+vy[f]]<t[ax][ay]+2) return;
dfs(ax+vx[f],ay+vy[f],f,ti+2);
} //creep 向左
if(s[ax+2*vx[f]][ay+2*vy[f]]!=1&&ax+2*vx[f]>=1&&ax+2*vx[f]<=N&&ay+2*vy[f]>=1&&ay+2*vy[f]<=M){
if(t[ax+2*vx[f]][ay+2*vy[f]]<t[ax][ay]+2) return;
dfs(ax+2*vx[f],ay+2*vy[f],f,ti+2);
} //walk 向左
if(s[ax+3*vx[f]][ay+3*vy[f]]!=1&&ax+3*vx[f]>=1&&ax+3*vx[f]<=N&&ay+3*vy[f]>=1&&ay+3*vy[f]<=M){
if(t[ax+3*vx[f]][ay+3*vy[f]]<t[ax][ay]+2) return;
dfs(ax+3*vx[f],ay+3*vy[f],f,ti+2);
} //run 向左
f++;
if(f==5) f=1;
if(s[ax+vx[f]][ay+vy[f]]!=1&&ax+vx[f]>=1&&ax+vx[f]<=N&&ay+vy[f]>=1&&ay+vy[f]<=M){
if(t[ax+vx[f]][ay+vy[f]]<t[ax][ay]+3) return;
dfs(ax+vx[f],ay+vy[f],f,ti+3);
} //creep 向后
if(s[ax+2*vx[f]][ay+2*vy[f]]!=1&&ax+2*vx[f]>=1&&ax+2*vx[f]<=N&&ay+2*vy[f]>=1&&ay+2*vy[f]<=M){
if(t[ax+2*vx[f]][ay+2*vy[f]]<t[ax][ay]+3) return;
dfs(ax+2*vx[f],ay+2*vy[f],f,ti+3);
} //walk 向后
if(s[ax+3*vx[f]][ay+3*vy[f]]!=1&&ax+3*vx[f]>=1&&ax+3*vx[f]<=N&&ay+3*vy[f]>=1&&ay+3*vy[f]<=M){
if(t[ax+3*vx[f]][ay+3*vy[f]]<t[ax][ay]+3) return;
dfs(ax+3*vx[f],ay+3*vy[f],f,ti+3);
} //run 向后
f++;
if(f==5) f=1;
if(s[ax+vx[f]][ay+vy[f]]!=1&&ax+vx[f]>=1&&ax+vx[f]<=N&&ay+vy[f]>=1&&ay+vy[f]<=M){
if(t[ax+vx[f]][ay+vy[f]]<t[ax][ay]+2) return;
dfs(ax+vx[f],ay+vy[f],f,ti+2);
} //creep 向右
if(s[ax+2*vx[f]][ay+2*vy[f]]!=1&&ax+2*vx[f]>=1&&ax+2*vx[f]<=N&&ay+2*vy[f]>=1&&ay+2*vy[f]<=M){
if(t[ax+2*vx[f]][ay+2*vy[f]]<t[ax][ay]+2) return;
dfs(ax+2*vx[f],ay+2*vy[f],f,ti+2);
} //walk 向右
if(s[ax+3*vx[f]][ay+3*vy[f]]!=1&&ax+3*vx[f]>=1&&ax+3*vx[f]<=N&&ay+3*vy[f]>=1&&ay+3*vy[f]<=M){
if(t[ax+3*vx[f]][ay+3*vy[f]]<t[ax][ay]+2) return;
dfs(ax+3*vx[f],ay+3*vy[f],f,ti+2);
} //run 向右
f++;
return;
}
int main(){
cin>>N>>M;
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++) t[i][j]=9;
}
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++) cin>>s[i][j];
}
cin>>xx1>>yy1>>xx2>>yy2;
cin>>face;
int ff;
if(face=='N') ff=1;
if(face=='E') ff=4;
if(face=='S') ff=3;
if(face=='W') ff=2;
dfs(xx1,yy1,ff,0);
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++) cout<<t[j][i]<<" ";
cout<<endl;
}
cout<<t[xx2][yy2];
return 0;
}
// 1
//2 4
// 3
北1,西2 ,南3,东4,屎山代码不知道哪里出问题了