#include #define F(i, n) for (i = 0; i < n; i++) #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define brkon(con1, con2) if ((con1) && (con2)) break int p[1000][3], n; typedef struct { int pos; int coo; } halfpoint; static int comp(const void *p1, const void *p2) { halfpoint *hp1 = (halfpoint*) p1; halfpoint *hp2 = (halfpoint*) p2; if (hp1->coo < hp2->coo) return -1; if (hp1->coo > hp2->coo) return 1; return 0; } int findnext(int coo, int coot, int act) { halfpoint pts[1000]; int ptsc = 0; int i; F(i, n) if ((coot == 0 && p[i][0] == coo) || (coot == 1 && p[i][1] == coo)) { pts[ptsc].pos = i; pts[ptsc++].coo = !coot ? p[i][0] : p[i][1]; } qsort(pts, ptsc, sizeof(halfpoint), comp); F(i, ptsc) { /*printf("%d> %d %d ", coot, pts[i].pos, pts[i].coo);*/ if (pts[i].pos == act) break; } /*printf("\n");*/ if (i % 2 == 0) return pts[i+1].pos; else return pts[i-1].pos; } int main() { int i, j, k, k0, pp; int minx, miny, minyp; int mx, my, nk; char d; char dir[1005]; int dirp[1005]; while (1) { scanf("%d", &n); brkon(!n, 1); F(i, n) scanf("%d%d", &p[i][0], &p[i][1]); minx = miny = 0x7FFF; F(i, n) minx = MIN(minx, p[i][0]); F(i, n) if (p[i][0] == minx) { if (miny > p[i][1]) { miny = p[i][1]; minyp = i; } } k = minyp; pp = 0; d = 'N'; do { dir[pp] = d; dirp[pp++] = k; /*printf("%c", d);*/ mx = my = 0x7FFF; switch (d) { case 'E': case 'W': k0 = findnext(p[k][0], 0, k); if (p[k][1] > p[k0][1]) d = 'N'; else d = 'S'; k = k0; break; case 'N': case 'S': k0 = findnext(p[k][1], 1, k); if (p[k][0] > p[k0][0]) d = 'E'; else d = 'W'; k = k0; break; } } while (k != minyp); F(i, pp) if (dirp[i] == 0) break; j = i; for(; i >= 0; i--) printf("%c", dir[i]); for(i = pp - 1; i > j; i--) printf("%c", dir[i]); printf("\n"); } return 0; }