#include using namespace std; using ll = long long; #define rep(i, s, e) for (int i = (int)(s); i < (int)(e); ++i) struct UnionFind { vector par; int group; UnionFind(int N) : par(N, -1), group(N) {} int root(int x) { if (par[x] < 0) return x; else return par[x] = root(par[x]); } bool merge(int x, int y) { if ((x = root(x)) == (y = root(y))) return false; if (par[x] > par[y]) swap(x, y); par[x] += par[y]; par[y] = x; --group; return true; } bool same(int x, int y) { return root(x) == root(y); } int size(int x) { return -par[root(x)]; } }; int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); int N, M; cin >> N >> M; vector C(N), cnt(N); rep(i, 0, N) { cin >> C[i]; ++cnt[C[i] - 1]; } int ans = 0; rep(i, 0, N) ans += max(cnt[i] - 1, 0); UnionFind uf(N); rep(i, 0, M) { int u, v; cin >> u >> v; --u, --v; if (C[u] == C[v] && !uf.same(u, v)) { uf.merge(u, v); --ans; } } cout << ans << '\n'; }