#include <bits/stdc++.h>
#define mp make_pair
using namespace std;

long long n, q, p[1010][30], s[1010][30], c[1010][30], t, u, v, uu[30], vv[30];
char cha;
bool nbip[1010][30], b, visu[1010], visv[1010];
vector<long long> adj[1010][30][2], ch[1010][30];

int komp(int a, int cl) {
    while(a!=p[a][cl]) a=p[a][cl];
    return a;
}

void dfski(int node, int cl) {
    c[node][cl]=1-c[node][cl];
    for(int i=0; i<ch[node][cl].size(); i++) {
        dfski(ch[node][cl][i], cl);
    }
}

void merrge(int a, int b, int cl) {
    if(komp(a, cl)==komp(b, cl)) {
        if(c[a][cl]!=c[b][cl]) nbip[komp(a, cl)][cl]=true;
        return;
    }
    adj[a][cl][0].push_back(b);
    adj[b][cl][0].push_back(a);
    int gh=0;
    if(c[a][cl]==c[b][cl]) gh=1;
    a=komp(a, cl);
    b=komp(b, cl);
    if(s[b][cl]>s[a][cl]) {
        int t=b;
        b=a;
        a=t;
    }
    p[b][cl]=a;
    s[a][cl]+=s[b][cl];
    ch[a][cl].push_back(b);
    if(gh) {
        dfski(b, cl);
        if(s[a][cl]>2) {
            adj[ch[a][cl][0]][cl][1].push_back(b);
            adj[b][cl][1].push_back(ch[a][cl][0]);
        }
    }
    else {
        adj[a][cl][1].push_back(b);
        adj[b][cl][1].push_back(a);
    }
}
/*
void dfsp(int node1, int node2) {
    for(int i='a'; i<='z'; i++) {
        for(int j1=0; j1<adj[node1][i].size(); j1++) {
            for(int j2=0; j2<adj[node2][i].size(); j2++) {
                if(!path[adj[node1][i][j1]][adj[node2][i][j2]]) {
                    path[adj[node1][i][j1]][adj[node2][i][j2]]=path[adj[node2][i][j2]][adj[node1][i][j1]]=true;
                    dfsp(adj[node1][i][j1], adj[node2][i][j2]);
                }
            }
        }
    }
}*/

void dfsu(int node) {
    for(int i=0; i<='z'-'a'; i++) {
        for(int j=0; j<adj[u][i][0].size(); j++) {
            //cout<<adj[u][i][0][j]<<' ';
            if(visv[adj[u][i][0][j]]) {
                u=-1;
                return;
            }
        }
    }
    visu[node]=true;
    for(int i=0; i<='z'-'a'; i++) {
        if(!adj[u][i][0].empty()) {
            if(vv[i]<0) {
                b=true;
                vv[i]=0;
            }
        }
        if(nbip[komp(u, i)]) {
            if(vv[i]<1) {
                b=true;
                vv[i]=1;
            }
        }
    }
    for(int i=0; i<='z'-'a'; i++) {
        if(uu[i]==1) {
            for(int j=0; j<adj[u][i][0].size(); j++) {
                if(visv[adj[u][i][0][j]]) {
                    u=-1;
                    i=40;
                    break;
                }
                if(!visu[adj[u][i][0][j]]) {
                    dfsu(adj[u][i][0][j]);
                    if(u==-1) {
                        i=40;
                        break;
                    }
                }
            }
        }
        else if(uu[i]==0) {
            for(int j=0; j<adj[u][i][1].size(); j++) {
                if(visv[adj[u][i][1][j]]) {
                    u=-1;
                    i=40;
                    break;
                }
                if(!visu[adj[u][i][1][j]]) {
                    dfsu(adj[u][i][1][j]);
                    if(u==-1) {
                        i=40;
                        break;
                    }
                }
            }
        }
    }
}

void dfsv(int node) {
    visv[node]=true;
    for(int i=0; i<='z'-'a'; i++) {
        if(!adj[v][i][0].empty()) {
            if(uu[i]<0) {
                uu[i]=0;
            }
        }
        if(nbip[komp(v, i)]) {
            if(uu[i]<1) {
                uu[i]=1;
            }
        }
    }
    for(int i=0; i<='z'-'a'; i++) {
        if(vv[i]==1) {
            for(int j=0; j<adj[v][i][0].size(); j++) {
                if(!visv[adj[v][i][0][j]]) {
                    dfsv(adj[v][i][0][j]);
                }
            }
        }
        else if(vv[i]==0) {
            for(int j=0; j<adj[v][i][1].size(); j++) {
                if(!visv[adj[v][i][1][j]]) {
                    dfsv(adj[v][i][1][j]);
                }
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>n>>q;
    for(int i=1; i<=n; i++) for(int cl=0; cl<='z'-'a'; cl++) {
        p[i][cl]=i;
        s[i][cl]=1;
    }
    while(q--) {
        cin>>t>>u>>v;
        if(t==1) {
            cin>>cha;
            merrge(u, v, cha-'a');
        }
        else {
            for(int i=0; i<='z'-'a'; i++) uu[i]=vv[i]=-1;
            for(int i=0; i<='z'-'a'; i++) {
                if(!adj[u][i][0].empty()) vv[i]=0;
                if(nbip[komp(u, i)]) vv[i]=1;
            }
            b=true;
            while(b) {
                b=false;
                for(int i=1; i<=n; i++) visu[i]=visv[i]=false;
                dfsv(v);
                dfsu(u);
                if(u==-1) {
                    cout<<1<<'\n';
                    break;
                }
            }
            if(u!=-1) cout<<0<<'\n';
        }
    }
    return 0;
}