Problem:
Score : 500 points

Problem Statement

There are N cards placed face down in a row. On each card, an integer 1 or 2 is written.

Let A_i be the integer written on the i-th card.

Your objective is to guess A_1, A_2, ..., A_N correctly.

You know the following facts:

For each i = 1, 2, ..., M, the value A_{X_i} + A_{Y_i} + Z_i is an even number.

You are a magician and can use the following magic any number of times:

Magic: Choose one card and know the integer A_i written on it. The cost of using this magic is 1.

What is the minimum cost required to determine all of A_1, A_2, ..., A_N?

It is guaranteed that there is no contradiction in given input.

Constraints

All values in input are integers.

2 \leq N \leq 10^5

1 \leq M \leq 10^5

1 \leq X_i < Y_i \leq N

1 \leq Z_i \leq 100

The pairs (X_i, Y_i) are distinct.

There is no contradiction in input. (That is, there exist integers A_1, A_2, ..., A_N that satisfy the conditions.)

Input

Input is given from Standard Input in the following format:

N M
X_1 Y_1 Z_1
X_2 Y_2 Z_2
\vdots
X_M Y_M Z_M

Output

Print the minimum total cost required to determine all of A_1, A_2, ..., A_N.

Sample Input 1

3 1
1 2 1

Sample Output 1

2

You can determine all of A_1, A_2, A_3 by using the magic for the first and third cards.

Sample Input 2

6 5
1 2 1
2 3 2
1 3 3
4 5 4
5 6 5

Sample Output 2

2

Sample Input 3

100000 1
1 100000 100

Sample Output 3

99999

Solution in C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cs
{
   public class Hutatu:IComparable<Hutatu>
    {
     public   int x, y;
        public Hutatu(int X, int Y)
        {
            if (x > y) { y = X; x = Y; return; }
            else { x = X; y = Y; }
        }
        public static bool operator<(Hutatu a,Hutatu b)
        {
            return a.x < b.x;
        }
        public static bool operator >(Hutatu a, Hutatu b)
        {
            return a.x > b.x;
        }
        public Hutatu copy()
        {
            return new Hutatu(x, y);
        }
        public int CompareTo(Hutatu o)
        {
            if (null == o) return 1;
            if (x < o.x) return -1;
            if (x > o.x) return 1;
            return 0;
        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            string[] str = Console.ReadLine().Split(' ');
            int N = int.Parse(str[0]);
            int M = int.Parse(str[1]);
            int[] Ns = new int[N];
            //List<Hutatu> huta = new List<Hutatu>();
            Hutatu[] huta = new Hutatu[M];
            for (int i = 0; i < Ns.Length; i++)
            {
                Ns[i] = i;
            }
            for (int i = 0; i < M; i++)
            {
                var str2 = Console.ReadLine().Split(' ');
                int x = int.Parse(str2[0]);
                int y = int.Parse(str2[1]);
                huta[i] = new Hutatu(x, y);
                //       if (Ns[x] < Ns[y]) { Ns[y] = Ns[x]; }
           //     else { Ns[x] = Ns[y]; } 
            }
            
       //     huta = sort(huta.ToArray(), 0, huta.Length - 1);
            Array.Sort(huta);
            for (int i = 0; i < M; i++)
            {
                if (huta[i].y > Ns[huta[i].x]) { Ns[huta[i].x-1] = Ns[huta[i].y-1];
                    continue;
                }
                Ns[huta[i].y-1] = Ns[huta[i].x-1];
            }
            int count = 0;
            for (int i = 0; i < N; i++)
            {
                if (Ns[i] != i) { count++; }
            }
            Console.WriteLine(N-count);
           
        }
        static Hutatu[] sort(Hutatu[] huta,int start,int end)
        {
            if (end - start <= 0) { return huta; }

            Hutatu pibot = huta[(start + end) / 2];
            int l = start, r = end;
            while (true)
            {
                while (huta[l] < pibot && l <= end)
                {
                    l++;
                }
                while (huta[r] > pibot && r >= start)
                {
                    r--;
                }
                if (l >= r) { break; }


                var tmp = huta[r].copy();
                huta[r] = huta[l].copy();
                huta[l] = tmp;
            }
            sort(huta, start, r - 1);
            sort(huta, r + 1, end);
            return huta;
        }
        
    }
}