#include #include #define REP(i,N) for(int i = 0; i<(N); ++i) using namespace std; typedef long long T; typedef long long LL; T INF = 1000000000LL * 1000000000LL; T GCD(T a, T b) { return b?GCD(b,a%b):a;} T eGCD(T a, T b, T &x, T &y) { if(!b){ x = 1, y = 0; return a; } T d = eGCD(b,a%b, y,x); y = a - x*(a/b)-y; x = b-x; return d; } T inverse(T a, T p) { T x,y; eGCD(a%p+p,p,x,y); return x % p; } bool crt_error; T CRT(T a, T m, T b, T n) { b = (b+n-(a%n))%n; T d = GCD(m,n); if((b%d) != 0) { crt_error = true; return 0; } T old_m = m; m /= d; b /= d; n /= d; return ((b*inverse(m,n))%n)*old_m + a; } LL lcm(T a, T b) { T d = GCD(a,b); return a/d*b; } bool scase() { int N; scanf("%d",&N); if(!N) return false; int next[5*N]; REP(k,N) { next[2*k] = 5*k; next[2*k+1] = 5*k+1; next[2*N+2*k] = 5*k + 2; next[2*N+2*k+1] = 5*k + 3; next[4*N + k] = 5*k+4; } int perm[5*N]; REP(i,5*N) { scanf("%d",&perm[i]); perm[i]--; } int poz[5*N]; REP(i,5*N) poz[perm[i]] = i; T res[N]; REP(player,N) { res[player] = INF; T M[5]; vector V[5]; REP(i,5) { int k = poz[i]; int r = 0; do { if(k/5 == player) V[i].push_back(r); r++; k = next[k]; } while( k != poz[i]); M[i] = r; } int poss = 1; REP(i,5) poss *= V[i].size(); REP(s2, poss) { int W[5]; int s = s2; REP(i,5) { W[i] = s%(V[i].size()); s /= V[i].size(); W[i] = V[i][W[i]]; } T MODU = M[0]; T resu = W[0]; crt_error = false; for(int i = 1; i<5; i++) { resu = CRT(resu,MODU,W[i], M[i]); MODU = lcm(MODU, M[i]); } if (!crt_error) { res[player] = min(res[player], resu); } } } int minpl = -1; LL minres = INF; REP(player,N) { if(res[player] < minres) { minres = res[player]; minpl = player; } } if (minres == INF) { printf("Neverending game.\n"); } else { printf("Player %d wins game number %lld.\n", minpl+1, minres); } return true; } int main() { while(scase()); return 0; }