//3333333333333333
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main(){
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int n,q=1,kar=0,raz=INT_MIN;cin>>n>>q;
    vector<pair<int,char>> adj[n+1];
    set<int> pamti[n+1];
    while(q--){
        int b;cin>>b;
        if(b==1){//dodaj granu
            int u,v;char c;
            cin >> u >> v >> c;
            if(c!='a')kar++;
            //u--;v--;
            adj[u].push_back(make_pair(v,c));
            adj[v].push_back(make_pair(u,c));
            //ovde se generise pamti
            pamti[u].insert(int(c-'a'));
            pamti[v].insert(int(c-'a'));
            raz=max(raz,(v-u));
        }
        else{//proveri
            int u,v,broj=0;
            cin >> u >> v;
            //u--;v--;
            if(u>v)swap(u,v);
            if(raz==1){//proveri da li je povezan sa tim cvorom, prvi podzadatak
                int rez=0;
                auto prvi=adj[u][0];
                auto drugi=adj[v][0];
                while(u<=v){
                    if(prvi.second!=drugi.second){
                        rez++;
                    }
                    (u)++;
                    (v)--;
                }
                if(rez)cout<<0<<endl;
                else cout<<1<<endl;
                continue;
            }
            //drugi podzadatak
            /*if(kar==0){//proveri da li moze da se dodje do tog cvora, kada se ponavlja samo a
                vector<int> obradjen(n+1);
                int ok=0;
                stack<int> stek;
                stek.push(u);
                while(!stek.empty()){
                    int tr=stek.top();
                    stek.pop();
                    if(obradjen[tr]==1)continue;
                    obradjen[tr]=1;
                    for(auto x:adj[tr]){
                        if(x.first==v){ok=1;break;}
                        stek.push(x.first);
                    }
                }
                if(ok)cout<<1<<endl;
                else cout<<0<<endl;
                continue;
            }*/
            //ostaje jos jedan podzadataks
            //gledamo koje vrednosti moze da ima tr cvor sa onim sa kojim je povezan
            //treba da napravim novi niz koji to pamti
            /*stack<pair<int,char> > zau,zav;
            zau.push({u,'0'});//proveravamo od u
            zav.push({v,'0'});//proveravamo od v
            vector<int> obradjen(n+1);
            while( (!zau.empty()) || (!zav.empty()) ){
                pair<int,char> uv,vu;//oznacava smer uv od u ka v i obrnuto
                uv=zau.top();//uzimamo prvi
                vu=zav.top();//uzimamo prvi

                if(obradjen[uv.first]){zau.pop();continue;}//ako je uv obradjen, brisemo i sledeci
                else{zau.pop();}//ako nije, samo ga brisemo

                if(obradjen[vu.first]){zav.pop();continue;}//ako je vu obradjen, brisemo i sledeci
                else{zav.pop();}//ako nije,samo ga brisemo
                obradjen[uv.first]=1;//obradimo
                obradjen[vu.first]=1;//obradimo
                //cout<<uv.first<<" "<<uv.second<<endl;
                //cout<<vu.first<<" "<<vu.second<<endl;
                for(auto x:adj[uv.first]){//proveravamo za pocetak, od uv.first
                    //int x.first je sa uv povezano sa char x.second vrednoscu
                    //moramo da proverimo palindrom
                    //tj, da li vu ima neki cvor sa tom vrednoscu
                    //ako ima dodaje se u niz

                    if(x.first==vu.first){//ako je cvor od uv, vu i cvor od vu, uv onda je uspelo
                        broj=1;
                        break;
                    }
                    //if(pamti[int(vu.first)].find(int(x.second-'a')) ){
                       //ako cvor od uv ima vrednost koju imaju cvorovi od vu.first
                       //sada treba da se ubace svi koji imaju vrednost x.second i povezani su sa vu.firest
                        for(auto y:adj[vu.first]){
                            if(y.second==x.second){//ubacujemo y.first i y.second u stek zav
                                zav.push({y.first,y.second});
                            }
                        }
                    //}
                }
            }*/

            //cout<<broj<<endl;
        }
    }
    /*for(int i=1;i<n;i++){
        for(auto x:adj[i]){
            cout<< i  << " " <<  x.first<<" "<<x.second<<endl;
        }cout<<endl;
    }*/

    return 0;
}









/*22222222222222
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main(){
    ios_base::sync_with_stdio(false);cin.tie(0);
    int n,prvi=0;cin>>n;
    int a[n],dp[n];
    ll zbir=0;
    int razsus=0;
    for(int i=0;i<n;i++){
        dp[i]=0;
        cin>>a[i];
        zbir+=ll(a[i]);
    }
    vector<int> adj[n];
    for(int i=0;i<n-1;i++){
        int u,v;
        cin >> u >> v;
        u--;v--;
        if(u==0 || v==0)prvi++;
        adj[u].push_back(v);
        adj[v].push_back(u);
        razsus=max(razsus,abs(v-u));
    }
    if(prvi==n-1){// svi su povezani sa njim prvi podzadatak
        if((zbir)-ll(a[0]) >=  ll(a[0])){//zbir svih bez prvog VS prvi
            cout<<a[0]<<endl;//prvi je manji ili jednak
            cout<<1<<endl;
            cout<<1<<endl;
            cout<<0<<endl;
        }
        else{
            cout<<(zbir)-ll(a[0])<<endl;
            cout<<n-1<<endl;
            for(int i=2;i<=n;i++){
                cout<<i<<" ";
            }cout<<endl;
            cout<<0<<endl;
        }
        return 0;
    }

    //int vr1=0,vr2=0;
    //treci podzadatak svaki je povezan sa susednim brojem
    vector<int>c,p;
    dp[0]=a[0];
    c.push_back(0);
    dp[1]=a[1];
    p.push_back(1);
    if(razsus==1){// dp se radi
        for(int i=2;i<n;i++){
            dp[i]=a[i]+min(dp[i-1],dp[i-2]);
            if(i%2==0){//paran, ide u crveno
                c.push_back(i);
            }
            else{
                p.push_back(i);
            }
        }
        cout<<dp[n-1]<<endl;
        cout<<c.size()<<endl;
        for(int i=0;i<c.size();i++){
            cout<< c[i]+1 << " ";
        }cout<<endl;
        cout<<p.size()<<endl;
        for(int i=0;i<p.size();i++){
            cout<< p[i]+1 << " ";
        }cout<<endl;
    }

    /*for(int i=0;i<n;i++){
        for(auto x:adj[i]){
            cout<<x<<" ";
        }cout<<endl;
    }*//*
    return 0;
}
*/