#include<bits/stdc++.h>#include<unordered_map>usingnamespace std;#define _for(i, a, b) for (int i = (a); i < (b); ++i)struct Point {int x, y;Point(int x =0,int y =0):x(x),y(y){}
Point operator+(const Point& t){return{ x + t.x, y + t.y };}
Point operator*(constint& t){return{ x * t, y * t };}booloperator==(const Point& t){return x == t.x && y == t.y;}};constint N =512;
unordered_map<int, vector<int>> blocks_x, blocks_y;constchar DIR[]="nesw";
Point go[]={{0,1},{1,0},{0,-1},{-1,0}};int vis[N][N];int T, n, k;
ostream&operator<<(ostream & os, vector<char>&path){for(constauto p : path) os << p;return os;}boolinRange(int x,int l,int r){if(l > r)returninRange(x, r, l);return l <= x && x <= r;}boolis_valid(Point& pf, Point& pt){if(pf.x == pt.x){if(!blocks_x.count(pt.x))returntrue;for(constauto& p : blocks_x[pt.x])if(inRange(p, pf.y, pt.y))returnfalse;}else{if(!blocks_y.count(pt.y))returntrue;for(constauto& p : blocks_y[pt.y])if(inRange(p, pf.x, pt.x))returnfalse;}returntrue;}voiddfs(Point p, vector<char>& path, set<string>& paths){int sz = path.size();if(sz == n){if(!p.x &&!p.y){
stringstream ss;
ss << path;
paths.insert(ss.str());}return;}if(((n - sz)*(sz +1+ n)/2)<(abs(p.x)+abs(p.y)))return;int dir =strchr(DIR, path.back())- DIR;for(int i =1; i <=3; i +=2){int d =(dir + i)%4;
Point dot = p +(go[d]*(sz +1));int x = dot.x +256;int y = dot.y +256;if(is_valid(p, dot)&&!vis[x][y]){
path.push_back(DIR[d]);
vis[x][y]=true;dfs(dot, path, paths);
vis[x][y]=false;
path.pop_back();}}}intmain(){#ifdef LOCALfreopen("data.in","r",stdin);#endif// LOCALscanf("%d",&T);// 输入翻转次数
_for (j,0, T){scanf("%d%d",&n,&k);_for(i,0, k){int x, y;scanf("%d%d",&x,&y);
blocks_x[x].push_back(y);
blocks_y[y].push_back(x);}
vector<char> path;
set<string> paths;_for(i,0,4){if(is_valid(go[i], go[i])){
path.push_back(DIR[i]);dfs(go[i], path, paths);
path.pop_back();}}for(constauto& p : paths)puts(p.c_str());printf("Found %zd golygon(s).\n\n", paths.size());
blocks_x.clear();
blocks_y.clear();memset(vis,0,sizeof vis);}return0;}