import sys inpu=sys.stdin.readline # UnionFind class UnionFind: def __init__(self,n): self.n=n self.par=[-1]*n # par[i]:i根ならグループiの要素数に-1をかけたもの。i根じゃないならiの親 self.rank=[0]*n self.p=[0]*n # iの根を返す def find(self,i): if self.par[i]<0:return i ii=i while self.par[i]>=0: i=self.par[i] #while i!=self.par[ii]: # ii,self.par[ii]=self.par[ii],i return i def find0(self,i): if self.par[i]<0:return i,self.p[i] ii=i point=self.p[i] while self.par[i]>=0: i=self.par[i] point+=self.p[i] #while i!=self.par[ii]: # ii,self.par[ii]=self.par[ii],i return i,point # iとjをunionし、根頂点を返す def union(self,i,j): i,j=self.find(i),self.find(j) if i==j:return i elif self.rank[i]>self.rank[j]: # par[i]:グループiの要素数で判断してもいい self.par[i]+=self.par[j] self.par[j]=i self.p[j]-=self.p[i] else: self.par[j]+=self.par[i] self.par[i]=j self.p[i]-=self.p[j] # 深さ(rank)が同じものを併合した場合1を足す if self.rank[i]==self.rank[j]: self.rank[j]+=1 return self.find(i) # iとjが同じグループに属するか判断 def same(self,i,j): return self.find(i)==self.find(j) # ノードiが属する木のサイズを返す def size(self,i): return -self.par[self.find(i)] def main0(n,q,tab): uf=UnionFind(n) mat=[0]*n ret=[] for t,a,b in tab: if t==1: uf.union(a-1,b-1) elif t==2: for v in range(n): if uf.same(a-1,v): mat[v]+=b else: ret.append(mat[a-1]) return ret def main1(n,q,tab): uf=UnionFind(n) ret=[] for t,a,b in tab: if t==1: uf.union(a-1,b-1) elif t==2: id=uf.find(a-1) uf.p[id]+=b else: id,tmp=uf.find0(a-1) ret.append(tmp) return ret if __name__=='__main__': n,q=map(int,input().split()) tab=[list(map(int,input().split())) for _ in range(q)] #ret0=main0(n,q,tab) ret1=main1(n,q,tab) #print(ret0) print(*ret1,sep="\n")