#include<bits/stdc++.h>
using namespace std;
const int maxn = 10;
map<char, int> dir = {{'N', 0}, {'E', 1}, {'S', 2}, {'W', 3}};
map<char, int> turn = {{'F', 0}, {'L', 1}, {'R', 2}};
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, -1, 0, 1};
struct Node{ int r, c, dir; };
int dis[maxn][maxn][4];
Node p[maxn][maxn][4];
bool canw[maxn][maxn][4][4];
Node walk(Node u, int turn){
int dir = u.dir;
if(turn == 1) dir = (dir + 3) % 4;
if(turn == 2) dir = (dir + 1) % 4;
return {u.r + dx[dir], u.c + dy[dir], dir};
}
int fx, fy;
Node st, stt;
string mazen;
bool read(){
cin >> mazen;
if(mazen == "END")
return 0;
memset(canw, 0, sizeof(canw));
char t;
cin >> st.r >> st.c >> t;
st.dir = dir[t];
stt = st;
cin >> fx >> fy;
int edgeR, edgeC;
while(cin >> edgeR){
if(edgeR == 0)
break;
cin >> edgeC;
string x;
while(cin >> x){
if(x == "*")
break;
int d = dir[x[0]];
for(int i = 1; i < x.size(); i ++)
canw[edgeR][edgeC][d][turn[x[i]]] = 1;
}
}
walk(stt, 0);
return 1;
}
bool inside(int x, int y){
return x >= 1 && y >= 1 && x <= 9 && y <= 9;
}
void print(Node u){
vector<Node> node;
while(true){
node.push_back(u);
if(dis[u.r][u.c][u.dir] == 0)
break;
u = p[u.r][u.c][u.dir];
}
node.push_back({st.r, st.c, st.dir});
int cnt = 0;
for(int i = node.size() - 1; i >= 0; i --){
if(cnt % 10 == 0) cout << " ";
cout << " (" << node[i].r << "," << node[i].c << ")";
if(++cnt % 10 == 0) puts("");
}
if(node.size() % 10 != 0) puts("");
}
void solve(){
queue<Node> q;
memset(dis, -1, sizeof(dis));
Node u = {stt.r, stt.c, stt.dir};
dis[u.r][u.c][u.dir] = 0;
q.push(u);
while(q.size()){
Node u = q.front();
q.pop();
if(u.r == fx && u.c == fy){
print(u);
return;
}
for(int i = 0; i < 3; i ++){
Node v = walk(u, i);
if(canw[u.r][u.c][u.dir][i] && inside(v.r, v.c) && dis[v.r][v.c][v.dir] == -1){
dis[v.r][v.c][v.dir] = dis[u.r][u.c][u.dir] + 1;
p[v.r][v.c][v.dir] = u;
q.push(v);
}
}
}
puts("No Solution Possible");
}
int main(){ while(read()) solve(); }