/**
indegreeOne<node>:存放入度为1的所有节点。
indegreeZero<node>:存放入度为0的所有节点,
对边u,v:
indeg0:
若u不存在,那么u加入indeg0,并且检查v在不在indeg0中。若v在,直接寄
若u存在,那么检查v即可。
indeg1:
若u不存在于indeg0且不存在于indeg1,u入indeg0。
若v存在于indeg1,那么v出indeg0。
最后检查indeg1大小是不是1.
最后:一条边没有也算树,所以我加了一个numEdges变量来针对这个用例
*/
#include<set>
#include<cstdio>
int main(){
    int u, v, treeNum=0, numEdges=0;
    bool isTree = true;
    std::set<int> indegreeOne;
    std::set<int> indegreeZero;
    while(true){
        scanf("%d %d", &u,&v);
        if(u==0&&v==0){
            ++treeNum;
            if(numEdges==0||isTree&&indegreeZero.size()==1){
                printf("Case %d is a tree.\n", treeNum);
            }else{
                printf("Case %d is not a tree.\n", treeNum);
                isTree=true;
            }
            indegreeOne.clear();
            indegreeZero.clear();
            numEdges=0;
        }else if(u==-1&&v==-1){
            break;
        }else{
            ++numEdges;
            if(!isTree) continue;    
            if(indegreeOne.count(v)>0){
                isTree=false;
            }
            indegreeOne.insert(v);
            if(indegreeZero.count(u)==0&&indegreeOne.count(u)==0){
                indegreeZero.insert(u);
            }
            indegreeZero.erase(v);
        }
    }
    return 0;
}