#pragma comment(linker, "/STACK:102400000,102400000")
#include <set>
#include <bitset>
#include <list>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#include <ios>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <utility>
#include <complex>
#include <numeric>
#include <functional>
#include <cmath>
#include <ctime>
#include <climits>
#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cassert>
using namespace std;
#define CFF freopen ("aaa.txt", "r", stdin)
#define CPPFF ifstream cin ("aaa.txt")
#define DB(ccc) cout << #ccc << " = " << ccc << endl
#define PB push_back
#define MP(A, B) make_pair(A, B)
typedef long long LL;
typedef unsigned long long ULL;
typedef double DB;
typedef pair <int, int> PII;
typedef pair <int, bool> PIB;
const int INF = 0x7FFFFFFF;
const int MOD = 1e9 + 7;
const double EPS = 1e-10;
const double PI = 2 * acos (0.0);
const int maxn = 1e6 + 6666;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
struct node
{
int x, y, cnt;
string cur;
node (int xx, int yy, string ccur, int ccnt) : x (xx), y (yy), cur (ccur), cnt (ccnt) {}
node () {}
};
int g[66][66], aa[66][66], sx, sy, ex, ey, row, col;
string dir;
int vis[66][66][66];
map <string, int> ma;
queue <node> qu;
bool OK (int x, int y)
{
if (x >= 1 && x <= row - 1 && y >= 1 && y <= col - 1)
return true;
return false;
}
int PP (node &s, int len, int flag)
{
int tt = ma[s.cur];
int tx = s.x + len * dx[tt], ty = s.y + len * dy[tt];
if (!flag) return tx;
else return ty;
}
void SS (node &tt)
{
for (int i = 1; i <= 3; i++)
{
int tx = PP (tt, i, 0), ty = PP (tt, i, 1);
if (OK (tx, ty) && g[tx][ty]) return ;
else if (OK (tx, ty) && !g[tx][ty] && vis[tx][ty][ma[tt.cur]] > tt.cnt + 1)
{
vis[tx][ty][ma[tt.cur]] = tt.cnt + 1;
qu.push (node (tx, ty, tt.cur, tt.cnt + 1));
}
}
}
node change (string s, node tt)
{
node res = tt;
if (s == "left")
{
if (ma[tt.cur] == 0) res.cur = "west";
if (ma[tt.cur] == 1) res.cur = "east";
if (ma[tt.cur] == 2) res.cur = "south";
if (ma[tt.cur] == 3) res.cur = "north";
}
else if (s == "right")
{
if (ma[tt.cur] == 0) res.cur = "east";
if (ma[tt.cur] == 1) res.cur = "west";
if (ma[tt.cur] == 2) res.cur = "north";
if (ma[tt.cur] == 3) res.cur = "south";
}
res.cnt++;
return res;
}
int minval;
void bfs ()
{
for (int i = 0; i < 66; i++)
for (int j = 0; j < 66; j++)
for (int k = 0; k < 66; k++)
vis[i][j][k] = INF;
vis[sx][sy][ma[dir]] = 0;
while (!qu.empty ()) qu.pop ();
qu.push (node (sx, sy, dir, 0));
while (!qu.empty ())
{
node tt = qu.front (); qu.pop ();
if (tt.x == ex && tt.y == ey)
minval = min (minval, tt.cnt);
node ta = change ("left", tt);
node tb = change ("left", ta);
node tc = change ("right", tt);
SS (tt);
SS (ta);
SS (tb);
SS (tc);
}
}
int main()
{
ma["north"] = 0; ma["south"] = 1; ma["west"] = 2; ma["east"] = 3;
// CPPFF;
while (cin >> row >> col)
{
if (row == 0 && col == 0)
break;
memset (g, 0, sizeof (g));
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
{
cin >> aa[i][j];
if (aa[i][j] == 1)
{
g[i][j] = g[i][j+1] = g[i+1][j] = g[i+1][j+1] = 1;
}
}
cin >> sx >> sy >> ex >> ey >> dir;
minval = INF;
bfs ();
if (minval == INF)
cout << "-1" << endl;
else
cout << minval << endl;
}
return 0;
}