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 PHP (5.6.30) (judge verdict: Wrong Answer)

<?php
fscanf(STDIN,"%d %d",$N,$K);
$arrayAlready = [];//既出の数字を入れる
$arrayResult = [];//この中に入っている数字番目のカードが分かれば答えが分かる、最小値を入れる
//下記($A,$B)が(1,2),(2,3),(3,4)…のように数字が被っている場合
//$A+$Bが偶数か奇数かは既知なので
//どれか一つの数字(例1)が分かればそれ以外の全て(例2,3,4…)も分かる
for($i=0;$i<$K;$i++){
  fscanf(STDIN,"%d %d %d",$A,$B,$C);//$Cは使わない
  $min = min($A,$B);
  $max = max($A,$B);
  if//(in_array($min,$arrayResult)){
    (array_search($min,$arrayResult)!==false){
    //arrayResultに両方ある場合、大きい方を消す
//    if(in_array($max,$arrayResult)){
//      array_diff($arrayResult,$max);
    if(($key = array_search($max,$arrayResult)) !== false){
      unset($arrayResult[$key]);
//      ${"array".$min}[] = $max;
    //既出でない場合既出にする
    }//elseif(!in_array($max,$arrayAlready)){
     elseif(array_search($max,$arrayAlready) === false){
      $arrayAlready[] = $max;
    }
  //arrayResultに大きい方のみがある場合、小さい方を既出にし、
  //arrayResult内の大きい方を小さい方に入れ替える
  //elseif(in_array($max,$arrayResult)){
  }elseif($key = array_search($max,$arrayResult) !== false){
    unset($arrayResult[$key]);
//    ${"array".$max}[] = $min;
//    ${"array".$min} = ${"array".$max};//${"array".$max}用済み
    $arrayAlready[] = $min;
    //arrayResultの中身を最小値に置き換える
    //array_diff($arrayResult,$max);
    $arrayResult[] = $min;
  //1回目は必ずここを通る
  //両方既出でない場合、arrayResultには必ずどちらかが追加されるので
  //arrayResultにどちらもないことは、既出がない($arrayAlreadyに両方ない)のと同じ
  }else{
//    ${"array".$min}[] = $min;
//    ${"array".$min}[] = $max;
    $arrayAlready[] = $min;
    $arrayAlready[] = $max;
    $arrayResult[] = $min;
  }
}
//追加情報のないデータは見ないと分からないので、未情報のデータ数を求め足す
$alone = $N-count($arrayAlready);
echo count($arrayResult)+$alone;