/*
分析:
学会了并查集的删除操作,找个点顶替要删除的点,就行了。
2012-07-17
*/
分析:
学会了并查集的删除操作,找个点顶替要删除的点,就行了。
2012-07-17
*/
#include"stdio.h"
#include"string.h"
int extra;
struct A
{
int pre;
int rep;
}E[1100011];
int hash[1100011];
void build(int n)
{
int i;
for(i=0;i<n;i++)
{
E[i].pre=i;
E[i].rep=i;
}
}
int find(int k)
{
if(E[k].pre==k) return k;
E[k].pre=find(E[k].pre);
return E[k].pre;
}
void Uninon(int a,int b)
{
int f1,f2;
f1=find(a);
f2=find(b);
if(f1!=f2) E[f1].pre=f2;
}
void del(int a)
{
E[a].rep=extra;
E[E[a].rep].pre=extra;
extra++;
}
int main()
{
int Case=1;
int n,m;
int i;
int a,b;
char str[5];
int ans;
int temp;
while(scanf("%d%d",&n,&m),n||m)
{
build(n);
extra=n;
while(m--)
{
scanf("%s",str);
if(str[0]=='M')
{
scanf("%d%d",&a,&b);
Uninon(E[a].rep,E[b].rep);
}
else
{
scanf("%d",&a);
del(a);
}
}
memset(hash,0,sizeof(int)*extra);
ans=0;
for(i=0;i<n;i++)
{
temp=find(E[i].rep);
if(hash[temp]==0)
{
hash[temp]=1;
ans++;
}
}
printf("Case #%d: %d\n",Case++,ans);
}
return 0;
}