#include #include #include #include #include #include #include #include #include #include using namespace std; #define FI first #define SE second #define X first #define Y second #define ST first #define ND second #define MP make_pair #define PB push_back typedef vector VI; typedef pair PII; typedef long long LL; typedef long double LD; typedef double D; #define REP(i,n) for(int i=0;i<(n);i++) #define FOR(i,a,b) for(int i=(a);i<=(b);i++) #define FORD(i,a,b) for(int i=(a);i>=(b);i--) #define FORE(a,b) for(VAR(a,(b).begin());a!=(b).end();a++) #define VAR(a,b) __typeof(b) a=(b) #define SIZE(a) ((int)(a).size()) #define ALL(x) (x).begin(),(x).end() #define CLR(x,a) memset(x,a,sizeof(x)) const int N = 5005; int t[N]; int n; LL gcd(LL a, LL b) { while (a && b) { a > b ? a %= b : b %= a; } return a + b; } int beg[5005], beg2[5005]; int per[N]; int lenCyc[N]; LL res; const LL INF = (1ULL << 63) - 1; int ok[7][5005]; int crok = 0; void go(LL cur, int x, vector >& okRem, vector& md, vector& lcms) { int myok = ++crok; if (x == (int) md.size()) { res = min(res, cur); return; } FORE (it, okRem[x]) { ok[x][*it] = myok; } int step = lcms[x - 1] % md[x]; int kroki = lcms[x] / lcms[x - 1]; int mine = cur % md[x]; REP (i, kroki) { if (ok[x][mine] == myok) { go(cur, x + 1, okRem, md, lcms); } cur += lcms[x - 1]; mine += step; if (mine >= md[x]) { mine -= md[x]; } } } int cyc[N], posCyc[N]; void alg() { for (int i = 1; i <= 5 * n; ++i) { cyc[i] = 0; scanf("%d", &beg2[i]); } int z = 0; for (int i = 1; i <= n; ++i) { t[++z] = 2 * i - 1; t[++z] = 2 * i; t[++z] = 2 * n + 2 * i - 1; t[++z] = 2 * n + 2 * i; t[++z] = 4 * n + i; } int guy = 0; for (int i = 1; i <= z; ++i) { beg[i] = beg2[t[i]]; } for (int i = 1; i <= z; ++i) { beg2[beg[i]] = i; per[t[i]] = i; } for (int i = 1; i <= z; ++i) { if (cyc[i] == 0) { lenCyc[i] = 0; int c = i; while (!cyc[c]) { cyc[c] = i; posCyc[c] = lenCyc[i]; ++lenCyc[i]; c = per[c]; } } } res = INF; for (int winner = 1; winner <= n; ++winner) { vector > okRem; vector md; okRem.PB(vector(1, 0)); md.PB(1); for (int j = 1; j <= 5; ++j) { vector rem; for (int k = (winner - 1) * 5 + 1; k <= winner * 5; ++k) { if (cyc[beg2[j]] == cyc[k]) { rem.PB((lenCyc[cyc[beg2[j]]] + posCyc[k] - posCyc[beg2[j]]) % lenCyc[cyc[beg2[j]]]); } } bool found = false; for (int k = 0; k < (int) md.size(); ++k) { if (md[k] == lenCyc[cyc[beg2[j]]]) { vector nxt; FORE (jt, rem) { FORE (kt, okRem[k]) { if (*jt == *kt) { nxt.PB(*jt); break; } } } okRem[k] = nxt; found = true; break; } } if (!found) { md.PB(lenCyc[cyc[beg2[j]]]); okRem.PB(rem); } } if (okRem[0].empty()) { continue; } vector lcms; LL lcm = 1; FORE (it, md) { lcm = (lcm * (*it / gcd(lcm, *it))); lcms.PB(lcm); } LL pres = res; go(0, 1, okRem, md, lcms); if (res < pres) { guy = winner; } } if (res == INF) { printf("Neverending game.\n"); } else { printf("Player %d wins game number %lld.\n", guy, res + 1); } } int main() { while (scanf("%d", &n), n != 0) { alg(); } return 0; }