
#include<iostream>
#include<set>
using namespace std;
int m,n;
int a[100005];
//int g[200005];
int fa[100005];
int sf(int x){return fa[x]==x?x:fa[x]=sf(fa[x]);}
int main(){
	while(cin>>n>>m){
		for(int i=1;i<=n;i++){
			fa[i]=i;
			cin>>a[i];
 		}
 		int u;int v;
 		for(int i=1;i<=m;i++){
 			cin>>u>>v;
 			fa[sf(a[u])]=sf(a[v]);
		}



//	for(int i=1;i<=2*m;i++){
	//		cout<<sf(fa[g[i]]);
	//	}
	//	cout<<endl;


		//这样子的话,输入的时候就预先初始化好了，然后再查询一下就好了
		//这样，能够联通的，有了共同爸爸的都放在一起了（虽然也不知道这些爸爸是谁。）
		//【一定是他们的sf相等！一定是sf相等！！！不然不行的不然到不了了   然后再查询
		int ans=0 ;
		for(int i=1;i<=n;i++){
		//	cout<<sf(g[i])<<" "<<sf(g[a[g[i]]])<<endl;
	//		if(sf(g[i])==sf(g[a[g[i]]]))
			if(sf(a[i])==sf(a[a[i]]))
			ans++;
		}

	//这里我就格外搞不懂了。。但是就是吧，需要注意一下，终极爸爸是sf。fa只是他的上级，没什么卵用的。
		cout<<ans<<endl;

	}
	return 0;
}