#include #include using namespace std; const int N = 1; const int S = 2; const int E = 4; const int W = 8; int main() { while (true) { int d; int x[1000], y[1000], t[1000][4] = {0}, pol[1000][2] = {0}, k[1000] = {0}, ilpol[1000] = {0}; scanf("%d", &d); if (d == 0) break; for (int i = 0; i < d; ++i) { scanf("%d%d", &x[i], &y[i]); } for (int i = 0 ; i < d; ++i) { for (int j = 0; j < d; j++) { if (i==j) continue; if (x[i] == x[j]) { if (y[i] < y[j]) { if (t[i][0] == 0 || y[t[i][0] - 1] > y[j]) { t[i][0] = j + 1; } } else { if (t[i][1] == 0 || y[t[i][1] - 1] < y[j]) { t[i][1] = j + 1; } } } else if (y[i] == y[j]) { if (x[i] < x[j]) { if (t[i][2] == 0 || x[t[i][2] - 1] > x[j]) { t[i][2] = j + 1; } } else { if (t[i][3] == 0 || y[t[i][3] - 1] < x[j]) { t[i][3] = j + 1; } } } } } int numConnected = 0; while(numConnected < d) { numConnected = 0; for (int i = 0; i < d; ++i) { if (ilpol[i] == 2) { ++numConnected; continue; } if (ilpol[i] == 1) { if (k[i] < 4) { if (t[i][2] == 0 || ilpol[t[i][2] - 1] == 2) { int j = t[i][3] - 1; pol[i][ilpol[i]++] = j; pol[j][ilpol[j]++] = i; k[i] |= W; k[j] |= E; } else if (t[i][3] == 0 || ilpol[t[i][3] - 1] == 2) { int j = t[i][2] - 1; pol[i][ilpol[i]++] = j; pol[j][ilpol[j]++] = i; k[i] |= E; k[j] |= W; } } else { if (t[i][0] == 0 || ilpol[t[i][0] - 1] == 2) { int j = t[i][1] - 1; pol[i][ilpol[i]++] = j; pol[j][ilpol[j]++] = i; k[i] |= S; k[j] |= N; } else if (t[i][1] == 0 || ilpol[t[i][1] - 1] == 2) { int j = t[i][0] - 1; pol[i][ilpol[i]++] = j; pol[j][ilpol[j]++] = i; k[i] |= N; k[j] |= S; } } } else { //0 connections if (t[i][2] == 0 || ilpol[t[i][2] - 1] == 2) { if (t[i][0] == 0 || ilpol[t[i][0] - 1] == 2) { int j = t[i][1] - 1; pol[i][ilpol[i]++] = j; pol[j][ilpol[j]++] = i; k[i] |= S; k[j] |= N; j = t[i][3] - 1; pol[i][ilpol[i]++] = j; pol[j][ilpol[j]++] = i; k[i] |= W; k[j] |= E; } else if (t[i][1] == 0 || ilpol[t[i][1] - 1] == 2) { int j = t[i][0] - 1; pol[i][ilpol[i]++] = j; pol[j][ilpol[j]++] = i; k[i] |= N; k[j] |= S; j = t[i][3] - 1; pol[i][ilpol[i]++] = j; pol[j][ilpol[j]++] = i; k[i] |= W; k[j] |= E; } } else if (t[i][3] == 0 || ilpol[t[i][3] - 1] == 2) { if (t[i][0] == 0 || ilpol[t[i][0] - 1] == 2) { int j = t[i][1] - 1; pol[i][ilpol[i]++] = j; pol[j][ilpol[j]++] = i; k[i] |= S; k[j] |= N; j = t[i][2] - 1; pol[i][ilpol[i]++] = j; pol[j][ilpol[j]++] = i; k[i] |= E; k[j] |= W; } else if (t[i][1] == 0 || ilpol[t[i][1] - 1] == 2) { int j = t[i][0] - 1; pol[i][ilpol[i]++] = j; pol[j][ilpol[j]++] = i; k[i] |= N; k[j] |= S; j = t[i][2] - 1; pol[i][ilpol[i]++] = j; pol[j][ilpol[j]++] = i; k[i] |= E; k[j] |= W; } } } } } //Tutaj juz krawedzie sa polaczone vector v; int xmin = x[0] , ymax = y[0]; int ibest = 0; for (int i = 1; i < d; ++i) { if (y[i] > ymax || (y[i] == ymax && x[i] < xmin)) { ibest = i; xmin = x[i]; ymax = y[i]; } } v.push_back(ibest); int start = 0; int last = ibest; int iter = t[ibest][2] - 1; int licznik = 0; while (iter != ibest) { ++licznik; if (iter == 0) start = licznik; v.push_back(iter); int next; if (pol[iter][0] == last) next = pol[iter][1]; else next = pol[iter][0]; last = iter; iter = next; } for (int i = start + 1; i < v.size(); ++i) if (x[v[i]] == x[v[i-1]]) if (y[v[i]] > y[v[i-1]]) printf("N"); else printf("S"); else if (x[v[i]] > x[v[i-1]]) printf("E"); else printf("W"); if (x[v[0]] == x[v[d-1]]) if (y[v[0]] > y[v[d-1]]) printf("N"); else printf("S"); else if (x[v[0]] > x[v[d-1]]) printf("E"); else printf("W"); for (int i = 1; i <= start; ++i) if (x[v[i]] == x[v[i-1]]) if (y[v[i]] > y[v[i-1]]) printf("N"); else printf("S"); else if (x[v[i]] > x[v[i-1]]) printf("E"); else printf("W"); printf("\n"); } return 0; }