class UnionFind:

    def __init__(self, size):

        self.parent = [-1 for i in range(size)]#非負なら親ノード，負ならグループの要素数



    def root(self, x):

        if self.parent[x] < 0:

            return x

        else:

            self.parent[x] = self.root(self.parent[x]) #xをxの根に直接つなぐ

            return self.parent[x]



    def union(self, x, y):

        x = self.root(x)

        y = self.root(y)

        if x == y:

            return False



        if self.parent[x] < self.parent[y]: #xの要素数がyの要素数より「小さい」とき

            x,y=y,x

        self.parent[x] += self.parent[y] #xの要素数を更新

        self.parent[y] = x #yをxにつなぐ

        return True



    def same(self, x, y):

        return self.root(x) == self.root(y)







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

p = list([int(x)-1 for x in input().split()])



uf = UnionFind(n)

for i in range(m):

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

    uf.union(x-1,y-1)



ans = 0

for i in range(n):

    if uf.same(i,p[i]):

        ans += 1



print(ans)
class UnionFind:

    def __init__(self, size):

        self.parent = [-1 for i in range(size)]#非負なら親ノード，負ならグループの要素数



    def root(self, x): #root(i): $i$の根ノードを返す．

        if self.parent[x] < 0:

            return x

        else:

            self.parent[x] = self.root(self.parent[x]) #xをxの根に直接つなぐ

            return self.parent[x]



    def union(self, x, y): #union(i,j): $i$のいるグループと$j$のいるグループをまとめる

        x = self.root(x)

        y = self.root(y)

        if x == y:

            return False

        if self.parent[x] > self.parent[y]: #xの要素数がyの要素数より「小さい」とき

            x,y=y,x

        self.parent[x] += self.parent[y] #xの要素数を更新

        self.parent[y] = x #yをxにつなぐ

        return True



    def same(self, x, y): #same(i,j): $i$と$j$ が同じグループにあるならTrue，違うならFalse

        return self.root(x) == self.root(y)

        

    def size(self,x): #size(i): $i$のいるグループの要素数を返す

        return -self.parent[self.root(x)]

#>>>>>>>>>>>>>>EhdCutHere>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>



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

p = list([int(x)-1 for x in input().split()])



uf = UnionFind(n)

for i in range(m):

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

    uf.union(x-1,y-1)



ans = 0

for i in range(n):

    if uf.same(i,p[i]):

        ans += 1



print(ans)

#print([uf.root(i) for i in range(n)])

#print([uf.parent[i] for i in range(n)])

#print([uf.size(i) for i in range(n)])



class UnionFind:
    def __init__(self, size):
        self.parent = [-1 for i in range(size)]  # 非負なら親ノード，負ならグループの要素数

    def root(self, x):
        if self.parent[x] < 0:
            return x
        else:
            self.parent[x] = self.root(self.parent[x])  # xをxの根に直接つなぐ
            return self.parent[x]

    def union(self, x, y):
        x = self.root(x)
        y = self.root(y)
        if x == y:
            return False
        if self.parent[x] < self.parent[y]:  # xの要素数がyの要素数より「小さい」とき
            x, y = y, x
        self.parent[x] += self.parent[y]  # xの要素数を更新
        self.parent[y] = x  # yをxにつなぐ
        return True

    def same(self, x, y):
        return self.root(x) == self.root(y)


n, m = list(map(int, input().split()))
p = list([int(x) - 1 for x in input().split()])
uf = UnionFind(n)
for i in range(m):
    x, y = list(map(int, input().split()))
    uf.union(x - 1, y - 1)
ans = 0
for i in range(n):
    if uf.same(i, p[i]):
        ans += 1
print(ans)

class UnionFind:
    def __init__(self, size):
        self.parent = [-1 for i in range(size)]  # 非負なら親ノード，負ならグループの要素数

    def root(self, x):  # root(i): $i$の根ノードを返す．
        if self.parent[x] < 0:
            return x
        else:
            self.parent[x] = self.root(self.parent[x])  # xをxの根に直接つなぐ
            return self.parent[x]

    def union(self, x, y):  # union(i,j): $i$のいるグループと$j$のいるグループをまとめる
        x = self.root(x)
        y = self.root(y)
        if x == y:
            return False
        if self.parent[x] > self.parent[y]:  # xの要素数がyの要素数より「小さい」とき
            x, y = y, x
        self.parent[x] += self.parent[y]  # xの要素数を更新
        self.parent[y] = x  # yをxにつなぐ
        return True

    def same(self, x, y):  # same(i,j): $i$と$j$ が同じグループにあるならTrue，違うならFalse
        return self.root(x) == self.root(y)

    def size(self, x):  # size(i): $i$のいるグループの要素数を返す
        return -self.parent[self.root(x)]


# >>>>>>>>>>>>>>EhdCutHere>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
n, m = list(map(int, input().split()))
p = list([int(x) - 1 for x in input().split()])
uf = UnionFind(n)
for i in range(m):
    x, y = list(map(int, input().split()))
    uf.union(x - 1, y - 1)
ans = 0
for i in range(n):
    if uf.same(i, p[i]):
        ans += 1
print(ans)
# print([uf.root(i) for i in range(n)])
# print([uf.parent[i] for i in range(n)])
# print([uf.size(i) for i in range(n)])

-    def root(self, x): +    def root(self, x):  # root(i): $i$の根ノードを返す． -    def union(self, x, y): +    def union(self, x, y):  # union(i,j): $i$のいるグループと$j$のいるグループをまとめる -        if self.parent[x] < self.parent[y]:  # xの要素数がyの要素数より「小さい」とき +        if self.parent[x] > self.parent[y]:  # xの要素数がyの要素数より「小さい」とき -    def same(self, x, y): +    def same(self, x, y):  # same(i,j): $i$と$j$ が同じグループにあるならTrue，違うならFalse +    def size(self, x):  # size(i): $i$のいるグループの要素数を返す +        return -self.parent[self.root(x)] + +# >>>>>>>>>>>>>>EhdCutHere>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +# print([uf.root(i) for i in range(n)]) +# print([uf.parent[i] for i in range(n)]) +# print([uf.size(i) for i in range(n)])