import java.util.Scanner;
import java.io.;
/
1.C:其实是合并集合
Q1:是否在同一集合中
Q2:对于这个题需要size来维护
键盘录入不能用Scanner;
*/
public class Main{
static int[] p = new int[100010];
static int[] size = new int[100010];
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
int n = Integer.parseInt(str[0]);
int m = Integer.parseInt(str[1]);
for(int i = 0;i <= n;i++){
p[i] = i;
size[i] = 1;
}
while(m-- > 0){
str = br.readLine().split(" ");
String x = str[0];
int s1 = Integer.parseInt(str[1]);
if(x.equals("C")){
//连接
int s2 = Integer.parseInt(str[2]);
size[find(s2)] += size[find(s1)];
p[find(s1)] = find(s2);
}else if(x.equals("Q1")){
//是否在同一个连通块中
//这两行代码要注意顺序****;
int s2 = Integer.parseInt(str[2]);
if(find(s1) == find(s2)){
System.out.println("Yes");
}else{
System.out.println("No");
}
}else if(x.equals("Q2")){
//连通块中的数量
System.out.println(size[find(s1)]);
}
}
}
public static int find(int x){
//找祖宗节点
if(p[x] != x){
p[x] = find(p[x]);
}
return p[x];
}