#include<iostream>#include<stdio.h>#include<stdlib.h>usingnamespace std;constint MAXSIZE =1000005;int father[MAXSIZE];structnode{int u;int v;}edge[MAXSIZE];voidinit(){for(int i=0;i<MAXSIZE;i++){
father[i]=-1;}}intfind(int x){if(father[x]==-1){return x;}else{
father[x]=find(father[x]);return father[x];}}voidUnion(int x,int y){
father[y]= x;}intmain(){int a,b;int t=1;int flag =1;int k;while(scanf("%d%d",&a,&b)==2){
flag =1;
k =0;if(a==-1&&b==-1)break;if(a==0&&b==0){
cout<<"Case "<<t++<<" is a tree."<<endl;continue;}init();int p =find(a);int q =find(b);if(p == q||q!=b){
flag =0;}elseUnion(p,q);
edge[k].u = a;
edge[k++].v = b;while(cin>>a>>b&&a&&b){if(flag ==0)continue;
p =find(a);
q =find(b);if(p == q||q!=b){
flag =0;}elseUnion(p,q);
edge[k].u = a;
edge[k++].v = b;}if(flag ==0) cout<<"Case "<<t++<<" is not a tree."<<endl;else{int u =find(edge[0].u);int i;for(i =1;i<k&&u==find(edge[i].u);i++);//判断其余边的其实点的根节点与第一条的是否相同。if(i == k)
cout<<"Case "<<t++<<" is a tree."<<endl;else cout<<"Case "<<t++<<" is not a tree."<<endl;}}return0;}