using System;
using System.Numerics;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace debug
{
    class main
    {
        static void Main(string[] args)
        {
            //問題クラスを展開
            ProgramD a = new ProgramD();
            a.main();//実行する

        }

    }

    class ProgramA
    {
        public void main()
        {
            //入力
            string[] s = Console.ReadLine().Split(' ');
            int a = int.Parse(s[0]);
            int b = int.Parse(s[1]);
            int c = int.Parse(s[2]);
            int d = int.Parse(s[3]);


            if (Math.Abs(a-b)<= d && Math.Abs(c - b) <= d)
                Console.WriteLine("Yes");
            else if(Math.Abs(c - a) <= d)
                Console.WriteLine("Yes");
            else
                Console.WriteLine("No");

        }
    }

    class ProgramB
    {
        public void main()
        {
            //入力
            int x = int.Parse(Console.ReadLine());

            for (int i = x; i > 0; i--)
            {
                for(int j = 2; j <= Math.Sqrt(x);j++)
                {
                    if(i % j == 0)
                    {
                        int t = i;
                        while (t % j == 0)
                            t /= j;

                        if(t == 1)
                        {
                            Console.WriteLine(i);
                            return;
                        }
                    }
                }

            }


            Console.WriteLine(1);
        }

        
    }

    class ProgramC
    {
        public void main()
        {

            //入力
            string s = Console.ReadLine();
            int k = int.Parse(Console.ReadLine());
            int[] al = new int[26];

            for(int i = 0;i < s.Length;i++)
                al[s[i] - 'a']++;

            int f = 0;
            
            for(int i = 0;i < 26;i++)
            {
                if (al[i] != 0)
                {
                    f = i;
                    break;
                }

            }


            //答え出力
            Console.WriteLine();

        }

        
    }



    class ProgramD
    {
        public void main()
        {

            //入力
            string[] input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            int m = int.Parse(input[1]);

            int[] a = new int[n];

            UnionFind tree = new UnionFind();//UnionFindクラスを設定
            tree.par = new int[n];
            tree.temp = new int[n];
            tree.reset(n);

            string[] input3 = Console.ReadLine().Split(' ');
            for (int i = 0; i < n; i++)
                a[i] = int.Parse(input3[i]);

            //Union-find法
            for (int i = 0; i < m; i++)
            {
                string[] input2 = Console.ReadLine().Split(' ');
                int x = int.Parse(input2[0]);
                int y = int.Parse(input2[1]);
                tree.unite(x - 1, y - 1); // xの木とyの木を併合する

                
            }
            int count = 0;
            //要素数-1を足し合わせる。（前のところで友だちは除いているので友だち候補のみ残る）
            for (int i = 0; i < n; i++)
            {
                if (tree.same(a[i] - 1, i) == true)
                    count++;
            }


            //答
            Console.WriteLine(count);
        }
    }

    /*UnionFind法のクラス*/
    class UnionFind
    {

        public int[] par;
        public int[] temp;


        //マイナスは根を示す。
        public void reset(int n)
        {
            for (int i = 0; i < n; i++)
                par[i] = -1;
        }

        //マイナスならそれはまだ属していないので根である。そうでないならさかのぼる
        public int root(int x)
        {
            if (par[x] < 0)
                return x;
            else
                return root(par[x]);
        }

        //根の併合を行い、根には要素数を足す（マイナスの値）
        public void unite(int x, int y)
        { // xとyの木を併合
            int rx = root(x); //xの根をrx
            int ry = root(y); //yの根をry
            if (rx == ry)
                return; //xとyの根が同じ(=同じ木にある)時はそのまま
            if (par[ry] > par[rx])
            {
                int temp = ry;
                ry = rx;
                rx = temp;
            }
            par[ry] += par[rx];
            par[rx] = ry; //xとyの根が同じでない(=同じ木にない)時：xの根rxをyの根ryにつける
        }

        // 2つのデータx, yが属する木が同じならtrueを返す
        public bool same(int x, int y)
        {
            int rx = root(x);
            int ry = root(y);
            return rx == ry;
        }


        //根の元に入っている
        public int size(int x)
        {
            return -par[root(x)];
        }
    }


}






Measured memory_bytes: 50148