static void Main(String[] args)
    {
        int q = Convert.ToInt32(Console.ReadLine());

        for (int a0 = 0; a0 < q; a0++)
        {
            string[] tokens_n = Console.ReadLine().Split(' ');
            int      n        = Convert.ToInt32(tokens_n[0]);
            int      m        = Convert.ToInt32(tokens_n[1]);
            long     Clib     = Convert.ToInt64(tokens_n[2]);
            long     Croad    = Convert.ToInt64(tokens_n[3]);

            DisjointUnionSets sets = new DisjointUnionSets(n);


            for (int a1 = 0; a1 < m; a1++)
            {
                string[] tokens_city_1 = Console.ReadLine().Split(' ');
                int      city_1        = Convert.ToInt32(tokens_city_1[0]) - 1;
                int      city_2        = Convert.ToInt32(tokens_city_1[1]) - 1;

                sets.union(city_1, city_2);
            }
            long custoTotal = -999;
            //Custo da biblioteca é menor que das estradas;
            if (Clib <= Croad)
            {
                custoTotal = Clib * n;
            }
            else
            {
                int conexao = sets.countSets();
                custoTotal = Clib * conexao + Croad * (n - conexao);
            }
            Console.WriteLine(custoTotal);
        }
    }