#!/usr/bin/env python3





n,m = list(map(int,input().split()))

p = list(map(int,input().split()))

for i in range(n):

    p[i] -= 1



#連結成分に属するかどうかを見るときはUnion-Findを用いる

#根(属するクラス)を返す関数

def root(x):

    if par[x] == x:

        return x

    par[x] = root(par[x])

    return par[x]

#同じクラスに属するかどうかを返す関数

def same(x,y):

    return root(x) == root(y)

#木を結合する関数

def union(x,y):

    x = root(x)

    y = root(y)

    #高さの高いほうに低いほうを結合

    if rank[x] < rank[y]:

        par[x] = y#xの親(属するクラス)をyとする

    else:

        par[y] = x

        if rank[x] == rank[y]:#高さが同じ場合

            rank[x] += 1#高さは1つ増える

par = [i for i in range(n)]

rank = [0 for _ in range(n)]

for i in range(m):

    x,y = list(map(int,input().split()))

    #swapできる頂点は同じ木にして同じ連結成分にする

    if not same(x-1,y-1):

        union(x-1,y-1)



ans = 0

for i in range(n):

    #p[i]とiが同じ連結成分ならばans+1

    if root(p[i]) == root(i):

        ans += 1

print(ans)

#!/usr/bin/env python3

#ABC97 D



import sys

import math

import bisect

import time

sys.setrecursionlimit(1000000000)

from heapq import heappush, heappop,heappushpop

from collections import defaultdict

from itertools import accumulate

from collections import Counter

from collections import deque

from operator import itemgetter

from itertools import permutations

mod = 10**9 + 7

inf = float('inf')

def I(): return int(sys.stdin.readline())

def LI(): return list(map(int,sys.stdin.readline().split()))



def root(x):

    if par[x] == x:

        return x

    par[x] = root(par[x])

    return par[x]



def union(x,y):

    x = root(x)

    y = root(y)



    if rank[x] < rank[y]:

        par[x] = y

    else:

        par[y] = x

        if rank[x] == rank[y]:

            rank[x] += 1

n,m = LI()

p = LI()

par = [i for i in range(n)]

rank = [0 for _ in range(n)]

for _ in range(m):

    x,y = LI()

    if root(x-1) != root(y-1):

        union(x-1,y-1)



ans = 0

for i in range(n):

    if root(p[i]-1) == root(i):

        ans += 1

print(ans)

#!/usr/bin/env python3
n, m = list(map(int, input().split()))
p = list(map(int, input().split()))
for i in range(n):
    p[i] -= 1
# 連結成分に属するかどうかを見るときはUnion-Findを用いる
# 根(属するクラス)を返す関数
def root(x):
    if par[x] == x:
        return x
    par[x] = root(par[x])
    return par[x]


# 同じクラスに属するかどうかを返す関数
def same(x, y):
    return root(x) == root(y)


# 木を結合する関数
def union(x, y):
    x = root(x)
    y = root(y)
    # 高さの高いほうに低いほうを結合
    if rank[x] < rank[y]:
        par[x] = y  # xの親(属するクラス)をyとする
    else:
        par[y] = x
        if rank[x] == rank[y]:  # 高さが同じ場合
            rank[x] += 1  # 高さは1つ増える


par = [i for i in range(n)]
rank = [0 for _ in range(n)]
for i in range(m):
    x, y = list(map(int, input().split()))
    # swapできる頂点は同じ木にして同じ連結成分にする
    if not same(x - 1, y - 1):
        union(x - 1, y - 1)
ans = 0
for i in range(n):
    # p[i]とiが同じ連結成分ならばans+1
    if root(p[i]) == root(i):
        ans += 1
print(ans)

#!/usr/bin/env python3
# ABC97 D
import sys
import math
import bisect
import time

sys.setrecursionlimit(1000000000)
from heapq import heappush, heappop, heappushpop
from collections import defaultdict
from itertools import accumulate
from collections import Counter
from collections import deque
from operator import itemgetter
from itertools import permutations

mod = 10**9 + 7
inf = float("inf")


def I():
    return int(sys.stdin.readline())


def LI():
    return list(map(int, sys.stdin.readline().split()))


def root(x):
    if par[x] == x:
        return x
    par[x] = root(par[x])
    return par[x]


def union(x, y):
    x = root(x)
    y = root(y)
    if rank[x] < rank[y]:
        par[x] = y
    else:
        par[y] = x
        if rank[x] == rank[y]:
            rank[x] += 1


n, m = LI()
p = LI()
par = [i for i in range(n)]
rank = [0 for _ in range(n)]
for _ in range(m):
    x, y = LI()
    if root(x - 1) != root(y - 1):
        union(x - 1, y - 1)
ans = 0
for i in range(n):
    if root(p[i] - 1) == root(i):
        ans += 1
print(ans)

-n, m = list(map(int, input().split())) -p = list(map(int, input().split())) -for i in range(n): -    p[i] -= 1 -# 連結成分に属するかどうかを見るときはUnion-Findを用いる -# 根(属するクラス)を返す関数 +# ABC97 D +import sys +import math +import bisect +import time + +sys.setrecursionlimit(1000000000) +from heapq import heappush, heappop, heappushpop +from collections import defaultdict +from itertools import accumulate +from collections import Counter +from collections import deque +from operator import itemgetter +from itertools import permutations + +mod = 10**9 + 7 +inf = float("inf") + + +def I(): +    return int(sys.stdin.readline()) + + +def LI(): +    return list(map(int, sys.stdin.readline().split())) + + -# 同じクラスに属するかどうかを返す関数 -def same(x, y): -    return root(x) == root(y) - - -# 木を結合する関数 -    # 高さの高いほうに低いほうを結合 -        par[x] = y  # xの親(属するクラス)をyとする +        par[x] = y -        if rank[x] == rank[y]:  # 高さが同じ場合 -            rank[x] += 1  # 高さは1つ増える +        if rank[x] == rank[y]: +            rank[x] += 1 +n, m = LI() +p = LI() -for i in range(m): -    x, y = list(map(int, input().split())) -    # swapできる頂点は同じ木にして同じ連結成分にする -    if not same(x - 1, y - 1): +for _ in range(m): +    x, y = LI() +    if root(x - 1) != root(y - 1): -    # p[i]とiが同じ連結成分ならばans+1 -    if root(p[i]) == root(i): +    if root(p[i] - 1) == root(i):