#include<bits/stdc++.h>
using namespace std;
int n, m, fx, fy, ex, ey;
bool ma[55][55], me[55][55];
char way;
struct ways{
int x, y;
char wa;
int cnt, flagl, flagr;
};
void bfs() {
queue <ways>q;
q.push({fx, fy, way, 0, 0, 0});
me[fx][fy] = true;
while(!q.empty()) {
ways b = q.front();
q.pop();
int nx = b.x, ny = b.y;
cout << nx << ' ' << ny << ' ' << b.wa << ' ' << b.cnt << endl;
if (nx == ex && ny == ey) {
cout << b.cnt;
exit(0);
}
me[nx][ny] = true;
if (b.wa == 'E') {
bool nflag = true;
if (ny + 1 <= m && !ma[nx][ny + 1] && !me[nx][ny + 1]) q.push({nx, ny + 1, 'E', b.cnt + 1, 0, 0});
else nflag = false;
if (ny + 2 <= m && !ma[nx][ny + 2] && !me[nx][ny + 2] && nflag) q.push({nx, ny + 2, 'E', b.cnt + 1, 0, 0});
else nflag = false;
if (ny + 3 <= m && !ma[nx][ny + 3] && !me[nx][ny + 3] && nflag) q.push({nx, ny + 3, 'E', b.cnt + 1, 0, 0});
if (b.flagl < 3) q.push({nx, ny, 'N', b.cnt + 1, b.flagl + 1, 0});
if (b.flagr < 3) q.push({nx, ny, 'S', b.cnt + 1, 0, b.flagr + 1});
continue;
}else if (b.wa == 'S') {
bool nflag = true;
if (nx + 1 <= n && !ma[nx + 1][ny] && !me[nx + 1][ny]) q.push({nx + 1, ny, 'S', b.cnt + 1, 0, 0});
else nflag = false;
if (nx + 2 <= n && !ma[nx + 2][ny] && !me[nx + 2][ny] && nflag) q.push({nx + 2, ny, 'S', b.cnt + 1, 0, 0});
else nflag = false;
if (nx + 3 <= n && !ma[nx + 3][ny] && !me[nx + 3][ny] && nflag) q.push({nx + 3, ny, 'S', b.cnt + 1, 0, 0});
if (b.flagl < 3) q.push({nx, ny, 'E', b.cnt + 1, b.flagl + 1, 0});
if (b.flagr < 3) q.push({nx, ny, 'W', b.cnt + 1, 0, b.flagr + 1});
continue;
}else if (b.wa == 'W') {
bool nflag = true;
if (ny - 1 > 0 && !ma[nx][ny - 1] && !me[nx][ny - 1]) q.push({nx, ny - 1, 'W', b.cnt + 1, 0, 0});
else nflag = false;
if (ny - 2 > 0 && !ma[nx][ny - 2] && !me[nx][ny - 2] && nflag) q.push({nx, ny - 2, 'W', b.cnt + 1, 0, 0});
else nflag = false;
if (ny - 3 > 0 && !ma[nx][ny - 3] && !me[nx][ny - 3] && nflag) q.push({nx, ny - 3, 'W', b.cnt + 1, 0, 0});
if (b.flagl < 3) q.push({nx, ny, 'S', b.cnt + 1, b.flagl + 1, 0});
if (b.flagr < 3) q.push({nx, ny, 'N', b.cnt + 1, 0, b.flagr + 1});
continue;
}else if (b.wa == 'N') {
bool nflag = true;
if (nx - 1 > 0 && !ma[nx - 1][ny] && !me[nx - 1][ny]) q.push({nx - 1, ny, 'N', b.cnt + 1, 0, 0});
else nflag = false;
if (nx - 2 > 0 && !ma[nx - 2][ny] && !me[nx - 2][ny] && nflag) q.push({nx - 2, ny, 'N', b.cnt + 1, 0, 0});
else nflag = false;
if (nx - 3 > 0 && !ma[nx - 3][ny] && !me[nx - 3][ny] && nflag) q.push({nx - 3, ny, 'N', b.cnt + 1, 0, 0});
if (b.flagl < 3) q.push({nx, ny, 'W', b.cnt + 1, b.flagl + 1, 0});
if (b.flagr < 3) q.push({nx, ny, 'E', b.cnt + 1, 0, b.flagr + 1});
continue;
}
}
cout << -1;
exit(0);
}
int main(){
cin >> n >> m;
for (int i = 1, flag; i <= n; i++) {
for (int j = 1; j <= m; j++) scanf("%d", &ma[i][j]);
}
cin >> fx >> fy >> ex >> ey >> way;
bfs();
return 0;
}