#include <bits/stdc++.h>
using namespace std;
char a[4000][4000];
bool b[4000][4000];
int x=2100,y=2100,last,zn=0,zb=3333,zx=3333,zd=0,nofx;
string fx[4]={"E","W","S","N"};
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0},now;
string cz[4]={"LEFT","RIGHT","GO"}; 
string go[2]={"FAIL","SUCC"};
bool check(){
	if(b[x+1][y]==true&&b[x][y+1]==true&&b[x][y-1]==true&&b[x-1][y]==true){
		return true;
	}
	return false;
}
struct node{
	int x,y,fx;
};
int main()
{
	memset(b,0,sizeof(b));
	a[x][y]='.';
	string rj="";
	queue<node>q;
	cout<<cz[0]<<'\n';
	if(rj==""){
		cin>>rj;
		if(rj=="E")now=0;
		if(rj=="W")now=1;
		if(rj=="S")now=2;
		if(rj=="N")now=3;
		q.push({x,y,now});
	}
	while (!q.empty()) {
		node p=q.front();
		int cc; 
		x=p.x;
		y=p.y;
		q.pop();
		b[x][y]=true;
		for(int i=0;i<=3;i++){
			cout<<cz[0]<<"\n";
			cin>>rj;
			if(rj=="E")nofx=0;
			if(rj=="W")nofx=1;
			if(rj=="S")nofx=2;
			if(rj=="N")nofx=3;
			cc=2;
			cout<<cz[cc]<<'\n';
			cin>>rj;
			if(rj==go[0])now=-1;
			if(rj==go[1])now=4;
			if(now==4){
				a[x+dx[nofx]][y+dy[nofx]]='.';
				b[x+dx[nofx]][y+dy[nofx]]=true;
				zn=max(zn,x+dx[nofx]);
				zb=min(zb,x+dx[nofx]);
				zx=min(zx,y+dy[nofx]);
				zd=max(zd,y+dy[nofx]);
				q.push({x+dx[nofx],y+dy[nofx],nofx});
			}
			else{
				zn=max(zn,x+dx[nofx]);
				zb=min(zb,x+dx[nofx]);
				zx=min(zx,y+dy[nofx]);
				zd=max(zd,y+dy[nofx]);
				a[x+dx[nofx]][y+dy[nofx]]='#';
				b[x+dx[nofx]][y+dy[nofx]]=true;
			}
		}
		a[x][y]='.';
		b[x][y]=true;
		if(check()){
			cout << "END" << endl;
			cout << zn-zb+1 << " " << zd-zx+1 << endl;
 			for (int i = zb; i <= zn; i++) {
 				for (int j = zx; j <= zd; j++) {
 					if(a[i][j]=='.')cout << a[i][j];
 					else cout<<'#';
 				}
 				cout << endl;
 			}
			break;
		}
	}
	return 0;
}