#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];
 		}
 		for(int i=1;i<=2*m;i=i+2){
 			cin>>g[i]>>g[i+1];
 			fa[sf(g[i])]=fa[g[i+1]];	
		}
		
		
		
//	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<=2*m;i++){
		//	cout<<sf(g[i])<<" "<<sf(g[a[g[i]]])<<endl;
			if(sf(g[i])==sf(g[a[g[i]]]))
			ans++;
		} 
	
	//这里我就格外搞不懂了。。但是就是吧，需要注意一下，终极爸爸是sf。fa只是他的上级，没什么卵用的。 
		cout<<ans<<endl; 

	}
	return 0;
} 
/*
		if(x==y){
	
		}else if{
			if(x==u){
				
				
			}else{
					
			}
	
		} 
*/
