#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
//英语 看博友分析 博友程序更简洁 bfs
int da[60][60];
int dis[60][60][4];
int vis[60][60][4];
int dx[4]={0,0,1,-1};//东 西 南 北
int dy[4]={1,-1,0,0};
struct nod{
int x;
int y;
int dir;
};
int main()
{
while(1)
{
int n,m;
cin>>n>>m;
if(n==0 && m==0)
{
break;
}
memset(da,0,sizeof(da));
memset(vis,0,sizeof(vis));
memset(dis,-1,sizeof(dis));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int x;
cin>>x;
if(x==1)
{
da[i][j]=1;
da[i+1][j]=1;
da[i][j+1]=1;
da[i+1][j+1]=1;
}
}
}
int sx,sy,ex,ey;
cin>>sx>>sy>>ex>>ey;
sx++;
sy++;
ex++;
ey++;
string s;
cin>>s;
int dir;
if(s=="east")
{
dir=0;//2 3
}else if(s=="west")
{
dir=1;//2 3
}else if(s=="south")
{
dir=2;//1 0
}else if(s=="north")
{
dir=3;//1 0
}
queue<nod> que;
que.push((nod){sx,sy,dir});
vis[sx][sy][dir]=1;
dis[sx][sy][dir]=0;
while(que.empty()!=1)
{
int tx=que.front().x;
int ty=que.front().y;
int td=que.front().dir;
que.pop();
if(td==0 || td==1)
{
if(vis[tx][ty][2]==0)
{
vis[tx][ty][2]=1;
dis[tx][ty][2]=dis[tx][ty][td]+1;
que.push((nod){tx,ty,2});
}
if(vis[tx][ty][3]==0)
{
vis[tx][ty][3]=1;
dis[tx][ty][3]=dis[tx][ty][td]+1;
que.push((nod){tx,ty,3});
}
}else if(td==2 || td==3)
{
if(vis[tx][ty][0]==0)
{
vis[tx][ty][0]=1;
dis[tx][ty][0]=dis[tx][ty][td]+1;
que.push((nod){tx,ty,0});
}
if(vis[tx][ty][1]==0)
{
vis[tx][ty][1]=1;
dis[tx][ty][1]=dis[tx][ty][td]+1;
que.push((nod){tx,ty,1});
}
}
if((tx+dx[td])>=2&&(tx+dx[td])<=n&&(ty+dy[td])>=2&&(ty+dy[td])<=m&&vis[tx+dx[td]][ty+dy[td]][td]==0&&da[tx+dx[td]][ty+dy[td]]==0)
{
vis[tx+dx[td]][ty+dy[td]][td]=1;
dis[tx+dx[td]][ty+dy[td]][td]=dis[tx][ty][td]+1;
que.push((nod){tx+dx[td],ty+dy[td],td});
}
if((tx+dx[td]*2)>=2&&(tx+dx[td]*2)<=n&&(ty+dy[td]*2)>=2&&(ty+dy[td]*2)<=m&&vis[tx+dx[td]*2][ty+dy[td]*2][td]==0&&da[tx+dx[td]][ty+dy[td]]==0&&da[tx+dx[td]*2][ty+dy[td]*2]==0)
{
vis[tx+dx[td]*2][ty+dy[td]*2][td]=1;
dis[tx+dx[td]*2][ty+dy[td]*2][td]=dis[tx][ty][td]+1;
que.push((nod){tx+dx[td]*2,ty+dy[td]*2,td});
}
if((tx+dx[td]*3)>=2&&(tx+dx[td]*3)<=n&&(ty+dy[td]*3)>=2&&(ty+dy[td]*3)<=m&&vis[tx+dx[td]*3][ty+dy[td]*3][td]==0&&da[tx+dx[td]][ty+dy[td]]==0&&da[tx+dx[td]*2][ty+dy[td]*2]==0&&da[tx+dx[td]*3][ty+dy[td]*3]==0)
{
vis[tx+dx[td]*3][ty+dy[td]*3][td]=1;
dis[tx+dx[td]*3][ty+dy[td]*3][td]=dis[tx][ty][td]+1;
que.push((nod){tx+dx[td]*3,ty+dy[td]*3,td});
}
}
/*
for(int i=1;i<=n+1;i++)
{
for(int j=1;j<=m+1;j++)
{
int jg=33;
for(int k=0;k<4;k++)
{
if(dis[i][j][k]!=-1)
{
jg=min(jg,dis[i][j][k]);
}
}
cout<<jg<<" ";
}
cout<<endl;
}*/
int ans=dis[ex][ey][0];
for(int i=1;i<4;i++)
{
ans=min(ans,dis[ex][ey][i]);
}
cout<<ans<<endl;
}
return 0;
}