#include <iostream>
#include <queue>
using namespace std;
struct node{
int posx,posy,step;
char face;
};
int n,m,a[55][55],startx,starty,endx,endy;
bool vis[55][55],visface[55][55]['w'+1];
char somepeoplehavenofaces;
void bfs()
{
queue<node> q;
q.push({startx,starty,0,somepeoplehavenofaces});
while(!q.empty())
{
node x=q.front();
cout<<x.posx<<' '<<x.posy<<' '<<x.step<<' '<<x.face<<endl;
if(x.posx==endx&&x.posy==endy)
{
cout<<x.step<<endl;
return;
}
switch(x.face)
{
case 'N':if(x.posx-1>=1&&!vis[x.posx-1][x.posy])
{vis[x.posx-1][x.posy]=true; q.push({x.posx-1,x.posy,x.step+1,x.face});}
if(x.posx-2>=1&&!vis[x.posx-2][x.posy])
{vis[x.posx-2][x.posy]=true; q.push({x.posx-2,x.posy,x.step+1,x.face});}
if(x.posx-3>=1&&!vis[x.posx-3][x.posy])
{vis[x.posx-3][x.posy]=true; q.push({x.posx-3,x.posy,x.step+1,x.face});}
break;
case 'S':if(x.posx+1<=n&&!vis[x.posx+1][x.posy])
{vis[x.posx+1][x.posy]=true; q.push({x.posx+1,x.posy,x.step+1,x.face});};
if(x.posx+2<=n&&!vis[x.posx+2][x.posy])
{vis[x.posx+2][x.posy]=true; q.push({x.posx+2,x.posy,x.step+1,x.face});};
if(x.posx+3<=n&&!vis[x.posx+3][x.posy])
{vis[x.posx+3][x.posy]=true; q.push({x.posx+3,x.posy,x.step+1,x.face});};
break;
case 'W':if(x.posy-1>=1&&!vis[x.posx][x.posy-1])
{vis[x.posx][x.posy-1]=true; q.push({x.posx,x.posy-1,x.step+1,x.face});};
if(x.posy-2>=1&&!vis[x.posx][x.posy-2])
{vis[x.posx][x.posy-2]=true; q.push({x.posx,x.posy-2,x.step+1,x.face});};
if(x.posy-3>=1&&!vis[x.posx][x.posy-3])
{vis[x.posx][x.posy-3]=true; q.push({x.posx,x.posy-3,x.step+1,x.face});};
break;
case 'E':if(x.posy+1<=m&&!vis[x.posx][x.posy+1])
{vis[x.posx][x.posy+1]=true; q.push({x.posx,x.posy+1,x.step+1,x.face});};
if(x.posy+2<=m&&!vis[x.posx][x.posy+2])
{vis[x.posx][x.posy+2]=true; q.push({x.posx,x.posy+2,x.step+1,x.face});};
if(x.posy+3<=m&&!vis[x.posx][x.posy+3])
{vis[x.posx][x.posy+3]=true; q.push({x.posx,x.posy+3,x.step+1,x.face});};
break;
}
char f;
switch(x.face)
{
case 'N':f='W';break;
case 'W':f='S';break;
case 'S':f='E';break;
case 'E':f='N';break;
}
if(!visface[x.posx][x.posy][f])
{
visface[x.posx][x.posy][f]=true;
q.push({x.posx,x.posy,x.step+1,f});
}
switch(x.face)
{
case 'N':f='E';break;
case 'E':f='S';break;
case 'S':f='W';break;
case 'W':f='N';break;
}
if(!visface[x.posx][x.posy][f])
{
visface[x.posx][x.posy][f]=true;
q.push({x.posx,x.posy,x.step+1,f});
}
q.pop();
}
cout<<-1<<endl;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]) vis[i][j]=1;
}
cin>>startx>>starty>>endx>>endy>>somepeoplehavenofaces;
vis[startx][starty]=true;
bfs();
return 0;
}