#include <bits/stdc++.h>
int n, m;
int qry[100100][3];
int en[100100];
int elist[100100];
int root[100100];
int dloc[100100];
int dend[100100];
int dtime;
int ndep[100100];
int chk[100100];
int mailn;
int msl[100100];
int mend[100100];
int uft[100100];
int uftf(int loc) {
  if (loc == uft[loc]) return loc;
  return uft[loc] = uftf(uft[loc]);
}
void dfs(int loc, int dep) {
  int i;
  ndep[loc] = dep;
  dloc[loc] = dtime;
  dtime++;
  chk[loc] = 1;
  for (i = en[loc]; i < en[loc + 1]; i++) {
    dfs(elist[i], dep + 1);
  }
  dend[loc] = dtime - 1;
}
int main() {
  int i;
  scanf("%d%d", &n, &m);
  for (i = 0; i < m; i++) {
    scanf("%d", &qry[i][0]);
    if (qry[i][0] == 2) {
      scanf("%d", &qry[i][1]);
    } else {
      scanf("%d%d", &qry[i][1], &qry[i][2]);
    }
    if (qry[i][0] == 3) qry[i][2]--;
    if (qry[i][0] == 1) {
      en[qry[i][2] + 2]++;
      root[qry[i][1]] = qry[i][2];
    }
  }
  for (i = 0; i < n + 3; i++) {
    en[i + 1] += en[i];
  }
  for (i = 0; i < m; i++) {
    if (qry[i][0] == 1) {
      elist[en[qry[i][2] + 1]] = qry[i][1];
      en[qry[i][2] + 1]++;
    }
  }
  for (i = 1; i <= n; i++) {
    if (chk[i] == 0 && root[i] == 0) dfs(i, 1);
    uft[i] = i;
  }
  for (i = 0; i < m; i++) {
    if (qry[i][0] == 2) {
      msl[mailn] = qry[i][1];
      mend[mailn] = ndep[uftf(qry[i][1])];
      mailn++;
    } else if (qry[i][0] == 1) {
      uft[qry[i][1]] = uftf(qry[i][2]);
    } else {
      if (dloc[msl[qry[i][2]]] < dloc[qry[i][1]] ||
          dloc[msl[qry[i][2]]] > dend[qry[i][1]]) {
        puts("NO");
      } else if (mend[qry[i][2]] > ndep[qry[i][1]]) {
        puts("NO");
      } else {
        puts("YES");
      }
    }
  }
}
