#include<iostream>
#include<cstring>
using namespace std;
#define maxn 10005
int data[maxn],pre[maxn],root[maxn],visit[maxn];
int main(){
int cnt,i,p,q,rootNum,tmp,nodeNum;
cnt = 1;
rootNum = nodeNum = 0;
bool flag = true;
memset(data,0,sizeof data);
memset(pre,0,sizeof pre);
memset(root,0,sizeof root);
memset(visit,0,sizeof visit);
while(scanf("%d%d",&p,&q)==2&&p!=-1){
if(!p){
for(int i=0;i<maxn;i++){
if(!visit[pre[i]]&&pre[i]){
tmp = i;
while(!visit[pre[tmp]]&&pre[tmp]){
tmp = pre[tmp];
visit[tmp] = true;
}
if(!pre[tmp]){
root[tmp] = 1;
}
}
}
for(int i=0;i<maxn;i++){
if(root[i]){
rootNum++;
}
}
if(rootNum!=1)flag = false;
if(!nodeNum)flag = true;
// for(int i=0;i<maxn;i++){
// if(data[i]){
// cout<<i<<" "<<data[i]<<endl;
// }
// }
if(flag)
printf("Case %d is a tree.\n",cnt);
else
printf("Case %d is not a tree.\n",cnt);
cnt++;
rootNum = nodeNum = 0;
memset(data,0,sizeof data);
memset(pre,0,sizeof pre);
memset(root,0,sizeof root);
memset(visit,0,sizeof visit);
flag = true;
}
else{
for(i=0;i<maxn;i++){
if(data[i]==q){
flag = false;
break;
}
}
if(flag){
data[p] = q;
pre[q] = p;
nodeNum++;
}
}
}
return 0;
}