#include using namespace std; #define F first #define S second #define R cin>> #define Z class #define ll long long #define ln cout<<'\n' #define in(a) insert(a) #define pb(a) push_back(a) #define pd(a) printf("%.10f\n",a) #define mem(a) memset(a,0,sizeof(a)) #define all(c) (c).begin(),(c).end() #define iter(c) __typeof((c).begin()) #define rrep(i,n) for(ll i=(ll)(n)-1;i>=0;i--) #define REP(i,m,n) for(ll i=(ll)(m);i<(ll)(n);i++) #define rep(i,n) REP(i,0,n) #define tr(it,c) for(iter(c) it=(c).begin();it!=(c).end();it++) ll check(ll n,ll m,ll x,ll y){return x>=0&&x=0&&yvoid pr(const A &a,const B&...b){cout<void PR(A a,ll n){rep(i,n){if(i)cout<<' ';cout< P; typedef pair PP; int p[500001],r[500001],c[500001],kk; void init(int n){kk=0;rep(i,n)p[i]=i,r[i]=0,c[i]=kk++;} int find(int x){return (p[x]==x)?x:(p[x]=find(p[x]));} void unite(int x,int y) { x=find(x),y=find(y); if(x==y)return; if(r[x] v[2000000]; P a[2000000]; void calc(int r) { int k=0; stack

s; s.push(P(r,-1)); while(!s.empty()) { P q=s.top();s.pop(); int x=q.F,p=q.S; if(-x==r||x!=r&&p<0) { a[-x].S=k; continue; } s.push(P(-x,-p)); a[x].F=k++; for(int i=0; i> n >> m; PP q[m]; rep(i,m) { cin >> q[i].F >> q[i].S.F >> q[i].S.S; q[i].S.F--; if(q[i].F==1) q[i].S.S--; } init(n); rep(i,m) { if(q[i].F==1) { ll x=c[find(q[i].S.F)],y=c[find(q[i].S.S)]; unite(q[i].S.F,q[i].S.S); ll z=c[find(q[i].S.F)]; v[z].pb(x); v[z].pb(y); } } vector g; rep(i,n) { if(find(i)==i) g.pb(i); } rep(i,g.size()-1) { ll x=c[find(g[i])],y=c[find(g[i+1])]; unite(g[i],g[i+1]); ll z=c[find(g[i])]; v[z].pb(x); v[z].pb(y); } calc(kk-1); if(kk==1) a[0]=P(0,1); init(n); rep(i,m) { ll x=q[i].S.F,y=q[i].S.S; if(q[i].F==1) { ll x=c[find(q[i].S.F)],y=c[find(q[i].S.S)]; unite(q[i].S.F,q[i].S.S); ll z=c[find(q[i].S.F)]; v[z].pb(x); v[z].pb(y); } else if(q[i].F==2) { ll z=c[find(x)]; t.add(a[z].F,a[z].S,y); } else { pr(t.getMin(a[x].F,a[x].S)); } } } int main(){ios::sync_with_stdio(0);cin.tie(0);Main();return 0;}