/*
现将相同的合并计数。
再枚举判断是否符合当cou==n*n是符合就退出
*/
#include<stdio.h>
#include<string.h>
#define N 900
int en[N][4],num[N],real[N][4],len,n,ok;
void pp(int a[4],int b[4])//赋值
{
a[0]=b[0];
a[1]=b[1];
a[2]=b[2];
a[3]=b[3];
}
void print(int a[4]) {
printf("%d %d %d %d\n",a[0],a[1],a[2],a[3]);
}
void dfs(int cou)
{
// printf("%d\n",cou);
// if(cou)
// print(en[cou]);
if(cou==n*n) {
ok=1;
return ;
}
if(ok)return ;
int i;
for(i=0;i<len; i++)
{
if(num[i]==0)continue;
if((cou%n==0||en[cou][1]==real[i][3])&&(cou/n==0||en[cou+1-n][2]==real[i][0])) {//注意判断条件对于优化程序很好
pp(en[cou+1],real[i]);
num[i]-=1;
dfs(cou+1);
num[i]+=1;
}
}
return ;
}
int main()
{
int i,k=0,w=0,a,b,c,j,d;
while(scanf("%d",&n),n)
{
ok=0;
memset(num,0,sizeof(num));
len=0;
for(i=1; i<=n*n; i++) {
scanf("%d%d%d%d",&a,&b,&c,&d);
for(j=0;j<len;j++)
if(a==real[j][0]&&b==real[j][1]&&c==real[j][2]&&d==real[j][3])
break;
if(j<len)
num[j]++;
if(j==len) {
real[len][0]=a;real[len][1]=b;
real[len][2]=c;real[len][3]=d;
num[len++]=1;
}
}//这里需要这样储存相同的,感觉有点坑啊 ,原来我的是先储存下来在合并合同的但是chaoshi,改成这样就不超时ile
if(w)
printf("\n");
dfs(0);
if(ok)
printf("Game %d: Possible\n",++k);
else
printf("Game %d: Impossible\n",++k);
w=1;
}
return 0;
}