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

long long n, q, p[1010][300], s[1010][300], c[1010][300], t, u, v;
char cha;
bool path[1010][1010], nbip[1010][300];
vector<long long> adj[1010][300], ch[1010][300];

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;
    }
    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;
    ch[a][cl].push_back(b);
    if(gh) dfski(b, cl);
}

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]);
                }
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>n>>q;
    for(int i=1; i<=n; i++) path[i][i]=true;
    while(q--) {
        cin>>t>>u>>v;
        if(t==1) {
            cin>>cha;
            adj[u][cha].push_back(v);
            adj[v][cha].push_back(u);
            path[u][v]=path[v][u]=true;
            dfsp(u, v);
            dfsp(u, u);
            dfsp(v, v);
            merrge(u, v, cha);
        }
        else {
            cout<<path[u][v]<<'\n';
        }
    }
    return 0;
}