import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static int id[]=null;
static BufferedWriter bw;
static int root(int node) {
while(id[node] != node) {
id[node] = id[id[node]];
node=id[node];
}
return node;
}
static void union(int firstNode, int secNode) {
int valueFirst = root(firstNode);
int valueSec = root(secNode);
if(valueFirst != valueSec) {
id[valueFirst] = valueSec;
}
}
static boolean isConnected(int firstNode, int secNode) {
return root(firstNode) == root(secNode);
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
bw =new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int count = Integer.parseInt(st.nextToken());
int testcase = Integer.parseInt(st.nextToken());
id= new int[count+1];
for(int i=1;i<=count;i++) {
id[i] = i;
}
for(int i=0;i<testcase;i++) {
st = new StringTokenizer(br.readLine());
int uniOrFind = Integer.parseInt(st.nextToken());
int firstNode=Integer.parseInt(st.nextToken());
int secNode=Integer.parseInt(st.nextToken());
if(uniOrFind == 0) {
union(firstNode, secNode);
}
else {
bw.write(isConnected(firstNode, secNode) ? "YES\n" : "NO\n");
}
}
bw.flush();
}
}