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++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <limits>
#include <numeric>
#include <type_traits>
#include <iomanip>
using namespace std;

int main() {
    int i,j,p,q,temp1,temp2;
    int k;
    int n,m;
    int num=1;
    cin>>n>>m;
    int minidx=m;
    int minidx2=m;
    int xyz[m][3];
    int flag[n+1];
    int kaisuu=1;
    int count[n+1];
    int temp=1;
    for(i=1; i<=n; ++i){
        flag[i-1]=0;
        count[i]=0;
    }

    for(i=0; i<m; ++i){
        cin>>xyz[i][0]>>xyz[i][1]>>xyz[i][2];
    }
    flag[0]=1;//ヒントを使ったかどうか
    count[xyz[0][0]]=1;//nは既知か
    count[xyz[0][1]]=1;
    while(num<m){//ヒントを使い切るまでループ

        for(j=1; j<m; ++j){
            if(num==m){break;}
            if(flag[j]==1){continue;}
            if(temp!=m){j=temp;temp=m;}
            if(count[xyz[j][0]]==1&&count[xyz[j][1]]!=1){count[xyz[j][1]]=1;++num;flag[j]=1;}
            else if(count[xyz[j][1]]==1&&count[xyz[j][0]]!=1){count[xyz[j][0]]=1;++num;flag[j]=1;}
            else if(count[xyz[j][1]]!=1&&count[xyz[j][0]]!=1){if(minidx>j){minidx=j;}else{if(minidx2>j){minidx2=j;}}}
            else if(count[xyz[j][1]]==1&&count[xyz[j][0]]==1){++num;flag[j]=1;}
        }
        if(num==m){break;}
        
        temp=minidx2;
        if(count[xyz[minidx][0]]==1||count[xyz[minidx][1]]==1){++num;flag[minidx]=1;count[xyz[minidx][0]]=1;count[xyz[minidx][1]]=1;minidx=m;minidx2=m;continue;}
        count[xyz[minidx][0]]=1;count[xyz[minidx][1]]=1;++num;flag[minidx]=1;
        minidx=m;minidx2=m;
        ++kaisuu;
    }
    for(i=1; i<=n; ++i){
        if(count[i]==0){++kaisuu;}
    }
    cout<<kaisuu;
    return 0;
}