class UnionFind{
  int n;
  int[] root;
  this(int n){
    root.length=n;
    foreach(i; 0..n) root[i]=i;
  }
  int find(int i){
    if(root[i]==i) return root[i];
    else return root[i]=find(root[i]);
  }
  void unite(int x, int y){
    x=find(x); y=find(y);
    if(x==y) return;
    root[x]=y;
  }
  bool same(int x, int y){
    return find(x)==find(y);
  }
}

void main(){
  import std.stdio, std.string, std.conv, std.algorithm;
  
  int n, m; rd(n, m);
  auto p=readln.split.to!(int[]);
  auto uf=new UnionFind(n);
  foreach(_; 0..m){
    int a, b; rd(a, b);
    uf.unite(a-1, b-1);
  }

  int cnt=0;
  foreach(i; 0..n){
    if(uf.same(i, p[i]-1)) cnt++;
  }
  writeln(cnt);
}

void rd(T...)(ref T x){
  import std.stdio, std.string, std.conv;
  auto l=readln.split;
  assert(l.length==x.length);
  foreach(i, ref e; x) e=l[i].to!(typeof(e));
}