class UnionFind: def __init__(self, n: int) -> None: """ 初期化 Parameters ---------- n:要素数 """ self.par = [-1] * (n + 1) self.rank = [0] * (n + 1) def root(self, x: int) -> int: """ xの属するグループの親番号を返す Parameters ---------- x:要素番号 Return ------ res:int xの属するグループの親番号 """ if self.par[x] == -1: return x else: self.par[x] = self.root(self.par[x]) return self.par[x] def issame(self, x, y) -> bool: """ xとyが同じグループに属するかどうかを返す Parameters ---------- x,y:要素番号 Return ------ res:bool true:xとyは同じグループである false:xとyは同じグループでない """ return self.root(x) == self.root(y) def unite(self, x, y) -> bool: """ xの属するグループとyの属するグループを併合する Parameters ---------- x,y:要素番号 Return ------ res:bool true:xとy、それぞれの属するグループを併合する false:xとyはすでに同じグループのため、併合は行わない """ x = self.root(x) y = self.root(y) # 既に同じグループなら何もしない if x == y: return False # unionbysize if self.rank[x] < self.rank[y]: self.par[x] = y else: self.par[y] = x if self.rank[x] == self.rank[y]: self.rank[x] += 1 return True def rank(self, x) -> int: """ xの高さを返す Return ------ res:int xの属する根付き木の高さ """ return self.rank[x] def groups(self) -> list: """ グループ構造の詳細を返す Return ------ res:list[] グループ構造を返す """ member = [[] for _ in range(len(self.par))] for v in range(len(self.par)): member[self.root(v)].append(v) res = [] for mem in member: if mem: res.append(mem) return res from collections import defaultdict N, M = map(int, input().split()) C = list(map(int, input().split())) UF = UnionFind(N) colors = defaultdict(int) for _ in range(M): u, v = map(int, input().split()) u -= 1 v -= 1 if C[u] == C[v]: UF.unite(u, v) for v in range(N): if v == UF.root(v): colors[C[v]] += 1 ans = sum([v - 1 for v in colors.values()]) print(ans)