//
//  main.cpp
//  Graph Wars
//
//  Created by Alex Rancea on 11/02/15.
//  Copyright (c) 2015 Alex Rancea. All rights reserved.
//

#include <iostream>
#include <vector>
using namespace std;

struct adaugat{
    int x;
    int y;
}intr[400000];

int main() {
    int n,m,i,valIntr,x,y,z=1,j;
    vector<vector<double>> az;
    cin>>n>>m;
    az.resize(n);
    for (int i = 0; i < n; ++i)
        az[i].resize(n);
    for(i=1;i<=m;i++){
        cin>>valIntr;
        switch (valIntr) {
            case 1:
                cin>>x>>y;
                az[x][y]=az[y][x] = 1;
                intr[z].x = x;
                intr[z].y = y;
                z++;
                break;
            case 2:
                cin>>x;
                intr[x].x = 0;
                intr[x].y = 0;
                break;
            case 3:
                cin>>x>>y;
                if(az[x][y]==0&&az[y][x]==0){
                    cout<<"YES";
                }
                else{
                    cout<<"NO";
                }
            default:
                break;
        }
    }
    
    return 0;
}