P1126
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int qx,qy,zx,zy;
char fang;
int mp[150][150];
int mp1[150][150];
int smp[150][150];
int vis[150][150];
struct H{
int x,y,tim;
char fangxiang;
};
queue<H> q;
int ans,anl;
void bfs(int a,int b){
H now;
while(!q.empty()){
now=q.front();
q.pop();
int X=now.x,Y=now.y,T=now.tim;
char F=now.fangxiang;
if(vis[X][Y]||smp[X][Y]==1||X>n||Y>n||X<1||Y<1)continue;
vis[X][Y]=1;
if(X==zx&&Y==zy){
ans=T+1;anl=1;
return;
}
if(F=='N'){
if(smp[X-1][Y]==0){
q.push((H){X-1,Y,T+1,F});
if(smp[X-2][Y]==0){
q.push((H){X-2,Y,T+1,F});
if(smp[X-3][Y]==0){
q.push((H){X-3,Y,T+1,F});
}
}
}
F='S';q.push((H){X,Y,T+2,F});
F='W';q.push((H){X,Y,T+1,F});
F='E';q.push((H){X,Y,T+1,F});
// F='N';q.push((H){X,Y,T+1,F});
}else if(F=='S'){
if(smp[X+1][Y]==0){
q.push((H){X+1,Y,T+1,F});
if(smp[X+2][Y]==0){
q.push((H){X+2,Y,T+1,F});
if(smp[X+3][Y]==0){
q.push((H){X+3,Y,T+1,F});
}
}
}
F='N';q.push((H){X,Y,T+2,F});
F='W';q.push((H){X,Y,T+1,F});
F='E';q.push((H){X,Y,T+1,F});
// F='N';q.push((H){X,Y,T+1,F});
}else if(F=='E'){
if(smp[X][Y+1]==0){
q.push((H){X,Y+1,T+1,F});
if(smp[X][Y+2]==0){
q.push((H){X,Y+2,T+1,F});
if(smp[X][Y+3]==0){
q.push((H){X,Y+3,T+1,F});
}
}
}
F='S';q.push((H){X,Y,T+2,F});
F='W';q.push((H){X,Y,T+1,F});
F='N';q.push((H){X,Y,T+1,F});
// F='N';q.push((H){X,Y,T+1,F});
}else if(F=='W'){
if(smp[X][Y-1]==0){
q.push((H){X,Y-1,T+1,F});
if(smp[X][Y-2]==0){
q.push((H){X,Y-2,T+1,F});
if(smp[X][Y-3]==0){
q.push((H){X,Y-3,T+1,F});
}
}
}
F='S';q.push((H){X,Y,T+2,F});
F='N';q.push((H){X,Y,T+1,F});
F='E';q.push((H){X,Y,T+1,F});
// F='N';q.push((H){X,Y,T+1,F});
}
}
return;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
if(mp[i][j]==1)mp1[i+1][j+1]=1;
}
}
for(int i=1;i<=n+1;i++){
for(int j=1;j<=m+1;j++){
if(mp1[i][j]==1){
mp1[i-1][j]=1;
mp1[i][j-1]=1;
mp1[i-1][j-1]=1;
}
}
}
// for(int i=1;i<=n+1;i++){
// for(int j=1;j<=m+1;j++){
// cout<<mp1[i][j]<<" ";
// }
// cout<<endl;
// }
// cout<<endl;
for(int i=2;i<=n;i++){
for(int j=2;j<=m;j++){
smp[i-1][j-1]=mp1[i][j];
}
}
// for(int i=1;i<n;i++){
// for(int j=1;j<m;j++){
// cout<<smp[i][j]<<" ";
// }
// cout<<endl;
// }
cin>>qx>>qy>>zx>>zy>>fang;
if(qx==zx&&qy==zy){
cout<<0;
return 0;
}
q.push((H){qx,qy,0,fang});
vis[qx][qy]=1;
bfs(qx,qy);
// cout<<endl;
if(anl)cout<<ans;
else cout<<"-1";
return 0;
}