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: Accepted)

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

namespace ABC126
{
    class E
    {
        static void Main(string[] args)
        {
            List<int> list = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToList();
            int N = list[0], M = list[1];
            UnionFind uf = new UnionFind(N);
            for(int i = 0; i < M; i++)
            {
                int[] a = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
                uf.Unite(a[0]-1, a[1]-1);
            }

            SortedSet<int> boss = new SortedSet<int>();
            for(int i = 0; i < N; i++)
            {
                boss.Add(uf.Root(i));
            }
            int r = boss.Count;

            Console.WriteLine(r);
        }

    }

    class UnionFind
    {
        private int N;
        public int[] parents; //親の番号を格納. 親の場合は-(メンバサイズ)

        public UnionFind(int n)
        {
            parents = new int[n];
            for (int i = 0; i < n; i++) parents[i] = -1;
            N = n;
        }

        //グループのボスを取得
        public int Root(int x)
        {
            if (parents[x] < 0) return x;
            parents[x] = Root(parents[x]); //次からはボスに直結するように構造を変える
            return parents[x];
        }

        //グループのメンバ数
        public int Size(int x)
        {
            int r = Root(x);
            return -parents[r];
        }

        public bool Unite(int x, int y)
        {
            x = Root(x);
            y = Root(y);
            if (x == y) return false;
            //メンバサイズが大きい方をボスとして合併
            if (Size(x) < Size(y))
            {
                parents[y] += parents[x];
                parents[x] = y;
            }
            else
            {
                parents[x] += parents[y];
                parents[y] = x;
            }
            return true;
        }
    }

}