import sys
sys.setrecursionlimit(1000000)

n,m=map(int,input().split())

#初期値が0の辞書
from collections import defaultdict
xyz = defaultdict(lambda: set([]))
for _ in range(m):
    x,y,z=map(int,input().split())
    xyz[x].add(y)
    xyz[y].add(x)

no_checked=[0]*n

def DFS(x):
    global no_checked
    global xyz
    no_checked[x-1]=1
    for item in xyz[x]:
        if no_checked[item-1]==0:
            DFS(item)

cnt=0
for i in range(1,n+1):
    if no_checked[i-1]==0:
        cnt+=1
        DFS(i)

    #print(i,no_checked)
print(cnt)
 import sys sys sys.setrecursionlimit(1000000) sys.setrecursionlimit sys setrecursionlimit 1000000 n,m=map(int,input().split()) n map(int,input().split()) map int input().split() ().split () input split m from collections import defaultdict xyz = defaultdict(lambda: set([])) xyz defaultdict(lambda: set([])) defaultdict lambda: set([]) set([]) set [] for _ in range(m):
    x,y,z=map(int,input().split())
    xyz[x].add(y)
    xyz[y].add(x) _ range(m) range m x,y,z=map(int,input().split()) x map(int,input().split()) map int input().split() ().split () input split y z xyz[x].add(y) [x].add [x] xyz x add y xyz[y].add(x) [y].add [y] xyz y add x no_checked=[0]*n no_checked [0]*n [0] 0 n def DFS(x):
    global no_checked
    global xyz
    no_checked[x-1]=1
    for item in xyz[x]:
        if no_checked[item-1]==0:
            DFS(item) DFS global no_checked global xyz no_checked[x-1]=1 no_checked[x-1] no_checked x-1 x 1 1 for item in xyz[x]:
        if no_checked[item-1]==0:
            DFS(item) item xyz[x] xyz x if no_checked[item-1]==0:
            DFS(item) no_checked[item-1]==0 no_checked[item-1] no_checked item-1 item 1 0 DFS(item) DFS item x x cnt=0 cnt 0 for i in range(1,n+1):
    if no_checked[i-1]==0:
        cnt+=1
        DFS(i)

    #print(i,no_checked) i range(1,n+1) range 1 n+1 n 1 if no_checked[i-1]==0:
        cnt+=1
        DFS(i)

    #print(i,no_checked) no_checked[i-1]==0 no_checked[i-1] no_checked i-1 i 1 0 cnt+=1 cnt 1 DFS(i) DFS i print(cnt) print cnt xyz = defaultdict(lambda: set([])) defaultdict(lambda: set([])) xyz z=map(int,input().split()) map(int,input().split()) z n,m=map(int,input().split()) map(int,input().split()) n y,z=map(int,input().split()) map(int,input().split()) y x,y,z=map(int,input().split()) map(int,input().split()) x def DFS(x):
    global no_checked
    global xyz
    no_checked[x-1]=1
    for item in xyz[x]:
        if no_checked[item-1]==0:
            DFS(item) def DFS(x):
    global no_checked
    global xyz
    no_checked[x-1]=1
    for item in xyz[x]:
        if no_checked[item-1]==0:
            DFS(item) DFS cnt+=1 1 cnt m=map(int,input().split()) map(int,input().split()) m cnt=0 0 cnt no_checked=[0]*n [0]*n no_checked
import sys
sys.setrecursionlimit(1000000)

n,m=map(int,input().split())

#初期値が0の辞書
from collections import defaultdict
xyz = defaultdict(lambda: set([]))
for _ in range(m):
    x,y,z=map(int,input().split())
    xyz[x].add(y)
    xyz[y].add(x)

no_checked=[0]*n

def DFS(x):
    global no_checked
    global xyz
    no_checked[x-1]=1
    for item in xyz[x]:
        if no_checked[item-1]==0:
            DFS(item)

cnt=0
for i in range(1,n+1):
    if no_checked[i-1]==0:
        cnt+=1
        DFS(i)

    #print(i,no_checked)
print(cnt)

