#include <bits/stdc++.h>

using namespace std;
vector< vector< int > > adj;
vector<bool> vis;
int c;
int dfs(int x){
    vis[x]=true;
    if(x==c) return true;
    queue<int> q;
    q.push(x);
    while(!q.empty()){
        int t=q.front();
        q.pop();
        for(auto y : adj[t]){
            if(y==c) return true;
            if(!vis[y]){
                vis[y]=true;
                q.push(y);
            }
        }
    }
    return false;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int n, q, t, u, v, ind=1;
    char ca;
    cin>>n>>q;
    adj.resize(n);
    vis.resize(n);
    vector<int> t1, u1, v1;
    vector<char> s(n, ' '), ca1;
    while(q--){
        cin>>t>>u>>v;
        t1.push_back(t); u1.push_back(u); v1.push_back(v);
        if(t==1){
            cin>>ca;
            ca1.push_back(ca);
            if(v!=(u+1)) ind=0;
        }
        else{
            ca1.push_back(' ');
        }
    }
    if(!ind){
        for(int i=0; i<u1.size(); i++){
            t=t1[i]; u=u1[i]; v=v1[i]; ca=ca1[i];
            if(t==1){
                adj[u-1].push_back(v-1);
                adj[v-1].push_back(u-1);
            }
            else{
                if(adj[v-1].size()*adj[u-1].size()==0) cout<<"0\n";
                else{
                    fill(vis.begin(), vis.end(), false);
                    c=v-1;
                    cout<<dfs(u-1)<<'\n';
                }
            }
        }
    }
    else{
        for(int i=0; i<u1.size(); i++){
            t=t1[i]; u=u1[i]; v=v1[i]; ca=ca1[i];
            if(t==1){
                adj[u-1].push_back(v-1);
                adj[v-1].push_back(u-1);
                s[u-1]=ca;
            }
            else{
                if(u>v) swap(u, v);
                int odg=1;
                for(int j=0; u-1+j<=v-2-j; j++)
                {
                    //cout<<s[u-1+j]<<' '<<s[v-2-j]<<'\n';
                    if( (s[u-1+j]!=s[v-2-j]) or (s[u-1+j]==' ') or (s[v-2-j]==' ') ){
                        odg=0;
                        break;
                    }

                }
                cout<<odg<<'\n';
            }
        }
    }
    return 0;
}