/*
一开始没想到一个龙珠的移动会带动别的龙珠,而且样例太水了,竟然过了,wa了n多次;
在并查集find里计数,不知道是哪位大神想到的,让我想了半天才弄明白点;
e[x]为x的移动数
T 1 2
find(1)=1,find(2)=2;
e[1]=1;
T 1 3
find(1)=2,e[1]=e[1]+e[2]=1,find(3)=3;
e[2]=1;
Q 1
find(1),e[1]=e[1]+e[2]=2;
*/
#include <stdio.h>
#include <string.h>
int f[10001],g[10001],e[10001]; //f[]为父结点,即所在位置,g为所在城市龙珠个数,e为转移次数
int n,m;
int find(int x)
{
if(f[x]!=x)
{
int t=f[x];
f[x]=find(f[x]);
e[x]+=e[t]; //经典,好好想想,我自己都没怎么懂
}
return f[x];
}
int main()
{
int T,tt=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
printf("Case %d:\n",tt++);
int i,j,k,a,b,aa,bb;
char ch;
for(i=1;i<=n;i++)
f[i]=i,g[i]=1,e[i]=0;
for(i=0;i<m;i++)
{
getchar();
scanf("%c",&ch);
if(ch=='T')
{
scanf("%d%d",&a,&b);
aa=find(a);
bb=find(b);
if(aa==bb) //这句应该可以不用的,输入应该就确保这种情况了,避免成环
continue;
g[bb]+=g[aa];
g[aa]=0;
f[aa]=bb;
e[aa]++;
}
else
{
scanf("%d",&a);
int mm=find(a); //!!!find会改变e[],所以输出用printf("%d %d %d\n",find(a),g[find(a)],e[a])就会错
printf("%d %d %d\n",mm,g[mm],e[a]);
}
}
}
return 0;
}