#include<bits/stdc++.h>template<classT>inlinevoidread(T &res){
char ch;bool flag =false; res =0;while(ch =getchar(),!isdigit(ch)&& ch !='-');
ch =='-'? flag =true: res = ch ^48;while(ch =getchar(),isdigit(ch))
res = res *10+ ch -48;
flag ? res =-res :0;}template<classT>inlinevoidput(T x){
if(x >9)put(x /10);putchar(x %10+48);}template<classT>inlinevoid_put(T x){
if(x <0)
x =-x,putchar('-');put(x);}template<classT>inlinevoidCkMin(T &x, T y){
x > y ? x = y :0;}template<classT>inlinevoidCkMax(T &x, T y){
x < y ? x = y :0;}template<classT>inline T Min(T x, T y){
return x < y ? x : y;}template<classT>inline T Max(T x, T y){
return x > y ? x : y;}template<classT>inline T Abs(T x){
return x <0?-x : x;}using std::set;using std::map;using std::pair;using std::string;using std::vector;using std::multiset;using std::priority_queue;typedeflonglong ll;typedeflongdouble ld;typedef set<int>::iterator it;constint Maxn =1e9;constint N =2e5+5;int n, top, T_data;
set<int> out[N];int ind[N], pre[N], stk[N], sze[N], fa[N];inlineintufs_find(int x){
if(fa[x]!= x)return fa[x]=ufs_find(fa[x]);return x;}inlinevoidMerge(int x,int y){
int tx =ufs_find(x),
ty =ufs_find(y);if(tx == ty)return;if(out[tx].size()< out[ty].size())
std::swap(tx, ty);
fa[ty]= tx;
sze[tx]+= sze[ty];for(it e2 = out[ty].begin(); e2 != out[ty].end();++e2){
y =*e2;
it e1 = out[tx].find(y);if(e1 == out[tx].end())
out[tx].insert(y);else{
--ind[y];if(ind[y]==1)
stk[++top]= y;}}}intmain(){
read(T_data);for(int t =1; t <= T_data;++t){
read(n);
top =0;for(int i =1; i <= n;++i){
out[i].clear();
fa[i]= i;
sze[i]=1;}for(int i =1, x; i <= n;++i){
read(ind[i]);for(int j =1; j <= ind[i];++j){
read(x);
out[x].insert(i);}
pre[i]= x;if(ind[i]==1)
stk[++top]= i;}while(top){
int x = stk[top--];Merge(pre[x], x);}int ans =0;for(int i =1; i <= n;++i)if(ufs_find(i)== i)CkMax(ans, sze[i]);printf("Case #%d: %d\n", t, ans);}return0;}