import sys input = lambda: sys.stdin.readline().rstrip() N, Q = map(int, input().split()) P = [-1 for i in range(N)] LA = [i for i in range(N)] NE = [-1] * N def par(a): L = [] while P[a] >= 0: L.append(a) a = P[a] for l in L: P[l] = a return a def unite(a, b): if par(a) != par(b): if P[par(b)] >= P[par(a)]: if P[par(b)] == P[par(a)]: P[par(a)] -= 1 NE[LA[par(a)]] = par(b) LA[par(a)] = LA[par(b)] P[par(b)] = par(a) else: NE[LA[par(b)]] = par(a) LA[par(b)] = LA[par(a)] P[par(a)] = par(b) X = [] for _ in range(Q): t, a, b = map(int, input().split()) X.append((t, a, b)) for t, a, b in X: if t == 1: a, b = a-1, b-1 unite(a, b) DONE = [0] * N ID = [-1] * N IDI = [-1] * N c = 0 for i in range(N): if DONE[i]: continue a = par(i) ID[a] = c IDI[c] = a DONE[a] = 1 c += 1 while NE[a] >= 0: a = NE[a] ID[a] = c IDI[c] = a DONE[a] = 1 c += 1 NN = 19 BIT=[0]*(2**NN+1) def addrange(l0, r0, x=1): l, r = l0, r0 while l <= 2**NN: BIT[l] += x l += l & (-l) while r <= 2**NN: BIT[r] -= x r += r & (-r) def getvalue(r): a = 0 while r != 0: a += BIT[r] r -= r&(-r) return a P = [-1 for i in range(N)] LA = [i for i in range(N)] NE = [-1] * N ANS = [] for t, a, b in X: if t == 1: a, b = a-1, b-1 unite(a, b) elif t == 2: a -= 1 a = par(a) addrange(ID[a] + 1, ID[LA[a]] + 2, b) else: a -= 1 ANS.append(getvalue(ID[a] + 1)) print("\n".join(map(str, ANS)))