#include<stdbool.h>
#include <stdio.h>
const int maxnode = 10000;
int father[maxnode];
int indegree[maxnode];
bool vis[maxnode];
int height[maxnode];
void initial(int m){
for(int i = 0; i < m; i++){
father[i] = i;
indegree[i] = 0;
height[i] = 0;
vis[i] = false;
}
}
int Find(int x){
if (x != father[x])
father[x] = Find(father[x]);
return father[x];
}
void Union(int a, int b){
a = Find(a);
b = Find(b);
if(a != b){
if (height[a] < height[b])
father[a] = b;
else if (height[a] > height[b])
father[b] = a;
else{
father[b] = a;
height[a]++;
}
}
}
bool istree(){
int com=0;
int root=0;
bool flag = true;
for (int i = 0; i < maxnode; i++){
if (!vis[i])
continue;
if(i == father[i])
com++;
if(indegree[i] == 0)
root++;
else if (indegree[i] > 1)
flag = false;
if (com != 1 || root != 1)
flag = false;
if (com == 0 && root == 0)
flag = true;
}
return flag;
}
int main() {
int a, b, k = 0;
initial(maxnode);
while (scanf("%d %d", &a, &b) != EOF) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
if(a == -1 && b == -1)
break;
if(a == 0 && b == 0){
k+=1;
if (istree())
printf("Case %d is a tree.\n", k);
else
printf("Case %d is not a tree.\n", k);
initial(maxnode);
}
else{
Union(a, b);
indegree[b]++;
vis[a] = true;
vis[b] = true;
}
}
return 0;
}