#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
bool vis[200020];
int F[200020];
void init()
{
memset(F,-1,sizeof(F));
memset(vis,0,sizeof(vis));
}
int find(int x)
{
if(F[x]==-1)
{
return x;
}
return F[x]=find(F[x]);//改了根
}
void bing(int x,int y)
{
int t1=find(x);//找到x的根
int t2=find(y);//找到y的根
if(t1==t2)
{
vis[t1]=1;//同一个根,该根变1
return;
}
F[t1]=t2;//如果x和y的根不同,修改t1的根t2
if(vis[t1])
{
vis[t2]=1;
}
}
int main()
{
int t;
scanf("%d",&t);
int k=0;
while(t--)
{
k++;
init();
int n;
scanf("%d",&n);
vector<int> a(n),b(n);
vector<int> val;
int i;
for(i=0;i<n;i++)
{
scanf("%d%d",&a[i],&b[i]);
val.push_back(a[i]);
val.push_back(b[i]);
}
sort(val.begin(),val.end());
int tot=unique(val.begin(),val.end())-val.begin();
val.resize(tot);
for(i=0;i<n;i++)
{
a[i]=lower_bound(val.begin(),val.end(),a[i])-val.begin();
b[i]=lower_bound(val.begin(),val.end(),b[i])-val.begin();
bing(a[i],b[i]);
}
int ans=tot;
for(i=0;i<tot;i++)//遍历c中不同的点
{
if(F[i]==-1&&!vis[i])
{
ans--;
}
}
printf("Case #%d: %d\n",k,ans);
}
}