import bisect def uf_find(n,p,slis): allsum = 0 time = -1 while p[n] != n: ind = bisect.bisect_left(slis[n],(time,0)) - 1 allsum += slis[n][-1][1] - slis[n][ind][1] time = max(time , linktime[n]) n = p[n] ind = bisect.bisect_left(slis[n],(time,0)) - 1 allsum += slis[n][-1][1] - slis[n][ind][1] return n,allsum def uf_union(a,b,p,rank,slis): ap,tmp = uf_find(a,p,slis) bp,tmp = uf_find(b,p,slis) if ap == bp: return True else: if rank[ap] > rank[bp]: p[bp] = ap linktime[bp] = loop elif rank[ap] < rank[bp]: p[ap] = bp linktime[ap] = loop else: p[bp] = ap rank[ap] += 1 linktime[bp] = loop return False N,Q = map(int,input().split()) TAB = [] p = [i for i in range(N)] rank = [1] * N slis = [[(-2,0)] for i in range(N)] linktime = [-1] * N for loop in range(Q): t,a,b = map(int,input().split()) a -= 1 if t == 1: b -= 1 uf_union(a,b,p,rank,slis) elif t == 2: nowp,asum = uf_find(a,p,slis) slis[nowp].append((loop,slis[nowp][-1][1] + b)) else: nowp,asum = uf_find(a,p,slis) print (asum)