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 AtCorder
{
	public class Program
	{
		static void Main(string[] args)
		{
			E();
		}


		private static bool[] oks_;
		private static Dictionary<int, List<int>> taiou_;
		private static int count_ = 0;

		public static void E()
		{
			count_ = 0;
			Scanner cin = new Scanner();
			int n = cin.Int();
			int m = cin.Int();
			oks_ = new bool[n];
			taiou_ = new Dictionary<int, List<int>>();
			for (int i = 0; i < m; i++) {
				int x = cin.Int();
				int y = cin.Int();
				int z = cin.Int();
				int s = x - 1;
				int b = y - 1;
				if (x > y) {
					s = y - 1;
					b = x - 1;
				}

				if (taiou_.ContainsKey(s)) {
					taiou_[s].Add(b);
				} else {
					List<int> tt = new List<int>();
					tt.Add(b);
					taiou_[s] = tt;
				}
			}

			for (int i = 0; i < n; i++) {
				Check(i);
			}

			Console.WriteLine(count_);
		}

		public static void Check(int number)
		{
			if (oks_[number]) {
				return;
			}

			if (taiou_.ContainsKey(number) == false) {
				count_++;
				oks_[number] = true;
			} else {
				count_++;
				oks_[number] = true;
				var taiou = taiou_[number];
				taiou_.Remove(number);
				foreach (int n2 in taiou) {
					if (oks_[n2]) {
						continue;
					}
					Check2(n2);
				}
			}
		}

		public static void Check2(int number)
		{
			if (oks_[number]) {
				return;
			}

			oks_[number] = true;
			if (taiou_.ContainsKey(number)) {
				var taiou = taiou_[number];
				taiou_.Remove(number);
				foreach (int n2 in taiou) {
					if (oks_[n2]) {
						continue;
					}
					Check2(n2);
				}
			}
		}
	}

	public class Scanner
	{
		string[] s;
		int i;

		char[] cs = new char[] { ' ' };

		public Scanner()
		{
			s = new string[0];
			i = 0;
		}

		public string Next()
		{
			if (i < s.Length) return s[i++];
			string st = Console.ReadLine();
			while (st == "") st = Console.ReadLine();
			s = st.Split(cs, StringSplitOptions.RemoveEmptyEntries);
			if (s.Length == 0) return Next();
			i = 0;
			return s[i++];
		}

		public int Int()
		{
			return int.Parse(Next());
		}
		public int[] ArrayInt(int N, int add = 0)
		{
			int[] Array = new int[N];
			for (int i = 0; i < N; i++) {
				Array[i] = Int() + add;
			}
			return Array;
		}

		public long Long()
		{
			return long.Parse(Next());
		}

		public long[] ArrayLong(int N, long add = 0)
		{
			long[] Array = new long[N];
			for (int i = 0; i < N; i++) {
				Array[i] = Long() + add;
			}
			return Array;
		}

		public double Double()
		{
			return double.Parse(Next());
		}


		public double[] ArrayDouble(int N, double add = 0)
		{
			double[] Array = new double[N];
			for (int i = 0; i < N; i++) {
				Array[i] = Double() + add;
			}
			return Array;
		}
	}
}