n, m = map(int, input().split()) from collections import deque #色iのスライムがどの箱に入っているかを管理 color = [[] for _ in range(n+1)] #箱iにどの色のスライムが入っているかを管理 box = [[] for _ in range(m+1)] for i in range(n): b, c = map(int, input().split()) box[b].append(c) color[c].append(b) #アクセス済みの箱を管理 distb = [-1] * (m+1) distb[0] = 0 #アクセス済みの色を管理 distc = [-1] * (n+1) distc[0] = 0 ans = 0 for i in range(m+1): if distb[i] == -1: distb[i] = 0 d = deque() d.append(i) while d: v = d.popleft() for j in box[v]: if distc[j] != -1: continue distc[j] = 0 #距離はどうでもいいので、0とかにしちゃう for k in color[j]: if distb[k] != -1: continue distb[k] = 0 #距離はどうでもいいので、0とかにしちゃう d.append(k) ans += 1 print(ans)