#include #include #include #include using namespace std; typedef pair pii; int n,q; int x[100001],y[100001],usun[100001]; int t[100001],v[100001],fu[10][100001]; map m; vector tr[1<<18]; vector ans; vector change[10]; void dodaj(int a,int b,int nr) { a+=(1<<17)-1; b+=(1<<17)+1; while (a+1>=1; b>>=1; } } int find(int poz,int a) { if (!fu[poz][a]) return a; change[poz].emplace_back(a,fu[poz][a]); fu[poz][a]=find(poz,fu[poz][a]); return fu[poz][a]; } void Union(int poz,int a,int b) { int fa=find(poz,a),fb=find(poz,b); if (fa!=fb) { change[poz].emplace_back(fa,fu[poz][fa]); fu[poz][fa]=fb; } } bool connected(int poz,int a,int b) { int fa=find(poz,a),fb=find(poz,b); return fa==fb; } void dfs(int a) { int* cof=(int*)malloc(10*sizeof(int)); for (int i=0; i<10; i++) cof[i]=change[i].size(); for (int nr:tr[a]) { int dan=v[nr]; for (int i=dan; i<10; i++) Union(i,x[nr],y[nr]); } if (a<(1<<17)) { dfs(a<<1); dfs((a<<1)+1); } else { int poz=a-(1<<17); if (poz<=q && t[poz]==2) { int bylo=0; for (int i=0; i<10; i++) { if (connected(i,x[poz],y[poz])) { ans.push_back(i); bylo=1; break; } } if (!bylo) ans.push_back(-1); } } for (int i=0; i<10; i++) { while ((int)change[i].size()!=cof[i]) { fu[i][change[i].back().first]=change[i].back().second; change[i].pop_back(); } } free(cof); } int main() { scanf("%d%d",&n,&q); for (int i=1; i<=q; i++) { scanf("%d%d%d",&t[i],&x[i],&y[i]); x[i]++; y[i]++; if (x[i]>y[i]) swap(x[i],y[i]); if (t[i]==0) { scanf("%d",&v[i]); m[make_pair(x[i],y[i])]=i; } if (t[i]==1) { v[i]=m[make_pair(x[i],y[i])]; dodaj(v[i],i,v[i]); usun[v[i]]=1; } } for (int i=1; i<=q; i++) { if (t[i]==0 && usun[i]==0) dodaj(i,q,i); } dfs(1); for (int x:ans) printf("%d\n",x); }