#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
vector<vector<int> > g;
vector<int> time_in,time_out,hieght;
int n,timee,flag;
void make_graph()
{
g.clear();
g.resize(n);
time_in.clear();
time_in.resize(n+1,-1);
time_out.clear();
time_out.resize(n+1,-1);
hieght.clear();
hieght.resize(n+1,0);
timee=0;
flag=0;
int i,r,u,v;
cin>>r;
for(i=1;i<=r;i++)
{
cin>>u>>v;
g[u].push_back(v);
}
}
int topological_Sort_Util(int v, stack<int> &Stack)
{
int i,ans=0;
time_in[v]=++timee;
for (i = 0; i < g[v].size(); ++i)
{
int curr;
if (time_in[g[v][i]]<0)
{
curr=topological_Sort_Util(g[v][i], Stack);
}
else
{
if(time_out[g[v][i]]>0)
{
curr=hieght[g[v][i]];
}
else
{
flag=-1;
break;
}
}
if(ans<curr)ans=curr;
}
if(flag==-1)
return -1;
ans++;
time_out[v]=++timee;
hieght[v]=ans;
// Push current vertex to stack which stores result
Stack.push(v);
return ans;
}
void topological_Sort()
{
stack<int> Stack;
for (int i = 0; i < n; i++)
if (time_in[i] < 0)
topological_Sort_Util(i, Stack);
while (Stack.empty() == false && flag!=-1)
{
//cout << Stack.top() << " ";
Stack.pop();
}
}
int main()
{
int t,x;
cin>>t;
for(x=1;x<=t;x++)
{
cin>>n;
make_graph();
topological_Sort();
int i,ans=0;
for(i=0;i<n;i++)
if(hieght[i]>ans)ans=hieght[i];
if(flag==-1)
{
cout<<"Case "<<x<<": Never Ends\n";
}
else
{
cout<<"Case "<<x<<": "<<ans<<" semester(s)\n";
}
}
return 0;
}
I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8dmVjdG9yPGludD4gPiBnOwp2ZWN0b3I8aW50PiB0aW1lX2luLHRpbWVfb3V0LGhpZWdodDsKaW50IG4sdGltZWUsZmxhZzsKdm9pZCBtYWtlX2dyYXBoKCkKewogICAgZy5jbGVhcigpOwogICAgZy5yZXNpemUobik7CiAgICB0aW1lX2luLmNsZWFyKCk7CiAgICB0aW1lX2luLnJlc2l6ZShuKzEsLTEpOwogICAgdGltZV9vdXQuY2xlYXIoKTsKICAgIHRpbWVfb3V0LnJlc2l6ZShuKzEsLTEpOwogICAgaGllZ2h0LmNsZWFyKCk7CiAgICBoaWVnaHQucmVzaXplKG4rMSwwKTsKICAgIHRpbWVlPTA7CiAgICBmbGFnPTA7CiAgICBpbnQgaSxyLHUsdjsKICAgIGNpbj4+cjsKICAgIGZvcihpPTE7aTw9cjtpKyspCiAgICB7CiAgICAgICAgY2luPj51Pj52OwogICAgICAgIGdbdV0ucHVzaF9iYWNrKHYpOwogICAgfQp9CgoKaW50IHRvcG9sb2dpY2FsX1NvcnRfVXRpbChpbnQgdiwgc3RhY2s8aW50PiAmU3RhY2spCnsKICAgIGludCBpLGFucz0wOwogICAgdGltZV9pblt2XT0rK3RpbWVlOwogICAgZm9yIChpID0gMDsgaSA8IGdbdl0uc2l6ZSgpOyArK2kpCiAgICAgICAgewogICAgICAgICAgICBpbnQgY3VycjsKICAgICAgICAgICAgaWYgKHRpbWVfaW5bZ1t2XVtpXV08MCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY3Vycj10b3BvbG9naWNhbF9Tb3J0X1V0aWwoZ1t2XVtpXSwgU3RhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYodGltZV9vdXRbZ1t2XVtpXV0+MCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjdXJyPWhpZWdodFtnW3ZdW2ldXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmbGFnPS0xOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICBpZihhbnM8Y3VycilhbnM9Y3VycjsKICAgICAgICB9CiAgICAgICAgaWYoZmxhZz09LTEpCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBhbnMrKzsKICAgICAgICB0aW1lX291dFt2XT0rK3RpbWVlOwogICAgICAgIGhpZWdodFt2XT1hbnM7CiAgICAvLyBQdXNoIGN1cnJlbnQgdmVydGV4IHRvIHN0YWNrIHdoaWNoIHN0b3JlcyByZXN1bHQKICAgIFN0YWNrLnB1c2godik7CiAgICByZXR1cm4gYW5zOwp9Cgp2b2lkIHRvcG9sb2dpY2FsX1NvcnQoKQp7CiAgICBzdGFjazxpbnQ+IFN0YWNrOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICBpZiAodGltZV9pbltpXSA8IDApCiAgICAgICAgdG9wb2xvZ2ljYWxfU29ydF9VdGlsKGksIFN0YWNrKTsKCiAgICB3aGlsZSAoU3RhY2suZW1wdHkoKSA9PSBmYWxzZSAmJiBmbGFnIT0tMSkKICAgIHsKICAgICAgICAvL2NvdXQgPDwgU3RhY2sudG9wKCkgPDwgIiAiOwogICAgICAgIFN0YWNrLnBvcCgpOwogICAgfQp9CmludCBtYWluKCkKewogICAgaW50IHQseDsKICAgIGNpbj4+dDsKICAgIGZvcih4PTE7eDw9dDt4KyspCiAgICB7CiAgICAgICAgY2luPj5uOwogICAgICAgIG1ha2VfZ3JhcGgoKTsKICAgICAgICB0b3BvbG9naWNhbF9Tb3J0KCk7CiAgICAgICAgaW50IGksYW5zPTA7CiAgICAgICAgZm9yKGk9MDtpPG47aSsrKQogICAgICAgICAgICBpZihoaWVnaHRbaV0+YW5zKWFucz1oaWVnaHRbaV07CgogICAgICAgIGlmKGZsYWc9PS0xKQogICAgICAgIHsKICAgICAgICAgICAgY291dDw8IkNhc2UgIjw8eDw8IjogTmV2ZXIgRW5kc1xuIjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgY291dDw8IkNhc2UgIjw8eDw8IjogIjw8YW5zPDwiIHNlbWVzdGVyKHMpXG4iOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9Cg==