#include <bits/stdc++.h>
using namespace std;
struct UF {
  vector<int> pare, rank;
  UF(int n) : pare(n), rank(n){ for(int i=0; i<n; i++){ pare[i]=i; rank[i]=0; } }
  int root(int x){ return (pare[x]==x)?x:pare[x]=root(pare[x]); }
  bool same(int x, int y){ return root(x)==root(y); }
  void marg(int x, int y){
    x=root(x); y=root(y); if(x==y) return;
    if(rank[x]<rank[y]){ pare[x]=y; }
    else{ pare[y]=x; if(rank[x]==rank[y]){rank[x]++;} }
  }
};

int main(){
int N, M; cin >> N >> M; int p[N], x[M], y[M], ans=0; UF G(N);
for(int i=0; i<N; i++){ cin >> p[i]; p[i]--; }
for(int i=0; i<M; i++){ cin >> x[i] >> y[i]; G.marg(--x[i], --y[i]); }
for(int i=0; i<N; i++){ if(G.same(i, p[i])){ ans++; } }
cout << ans << "\n";
}