import sys

input = sys.stdin.buffer.readline
n, m = map(int, input().split())


# union-find
# xの根を求める


def find(x):
    if par[x] < 0:
        return x
    else:
        par[x] = find(par[x])
        return par[x]


# xとyの属する集合の併合
def unite(x, y):
    x = find(x)
    y = find(y)
    if x == y:
        return False
    else:
        # sizeの大きい方をxとする
        if par[x] > par[y]:
            x, y = y, x
        par[x] += par[y]
        par[y] = x
        return True


# xとyが同じ集合か判定
def is_same(x, y):
    return find(x) == find(y)


def size(x):
    return -par[find(x)]


# 初期化
# 根なら-size、子なら親の頂点
par = [-1] * (n + 1)

for _ in range(m):
    x, y, z = map(int, input().split())
    unite(x, y)
ans = 0
for i in range(1, n + 1):
    if i == find(i):
        ans += 1
print(ans) import sys sys input = sys.stdin.buffer.readline input sys.stdin.buffer.readline sys.stdin.buffer sys.stdin sys stdin buffer readline n, m = map(int, input().split()) n map(int, input().split()) map int input().split() ().split () input split m def find(x):
    if par[x] < 0:
        return x
    else:
        par[x] = find(par[x])
        return par[x]


# xとyの属する集合の併合 find if par[x] < 0:
        return x
    else:
        par[x] = find(par[x])
        return par[x]


# xとyの属する集合の併合 par[x] < 0 par[x] par x 0 return x x par[x] = find(par[x]) par[x] par x find(par[x]) find par[x] par x return par[x] par[x] par x x x def unite(x, y):
    x = find(x)
    y = find(y)
    if x == y:
        return False
    else:
        # sizeの大きい方をxとする
        if par[x] > par[y]:
            x, y = y, x
        par[x] += par[y]
        par[y] = x
        return True


# xとyが同じ集合か判定 unite x = find(x) x find(x) find x y = find(y) y find(y) find y if x == y:
        return False
    else:
        # sizeの大きい方をxとする
        if par[x] > par[y]:
            x, y = y, x
        par[x] += par[y]
        par[y] = x
        return True


# xとyが同じ集合か判定 x == y x y return False False if par[x] > par[y]:
            x, y = y, x
         par[x] > par[y] par[x] par x par[y] par y x, y = y, x x y y x par[x] += par[y] par[x] par x par[y] par y par[y] = x par[y] par y x return True True x x y y def is_same(x, y):
    return find(x) == find(y) is_same return find(x) == find(y) find(x) == find(y) find(x) find x find(y) find y x x y y def size(x):
    return -par[find(x)]


# 初期化
# 根なら-size、子なら親の頂点 size return -par[find(x)] -par[find(x)] par[find(x)] par find(x) find x x x par = [-1] * (n + 1) par [-1] * (n + 1) [-1] -1 n + 1 n 1 for _ in range(m):
    x, y, z = map(int, input().split())
    unite(x, y) _ 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 unite(x, y) unite x y ans = 0 ans 0 for i in range(1, n + 1):
    if i == find(i):
        ans += 1 i range(1, n + 1) range 1 n + 1 n 1 if i == find(i):
        ans += 1 i == find(i) i find(i) find i ans += 1 ans 1 print(ans) print ans x, y, z = map(int, input().split()) map(int, input().split()) x def find(x):
    if par[x] < 0:
        return x
    else:
        par[x] = find(par[x])
        return par[x]


# xとyの属する集合の併合 def find(x):
    if par[x] < 0:
        return x
    else:
        par[x] = find(par[x])
        return par[x]


# xとyの属する集合の併合 find ans = 0 0 ans input = sys.stdin.buffer.readline sys.stdin.buffer.readline input n, m = map(int, input().split()) map(int, input().split()) n z = map(int, input().split()) map(int, input().split()) z ans += 1 1 ans par = [-1] * (n + 1) [-1] * (n + 1) par m = map(int, input().split()) map(int, input().split()) m def unite(x, y):
    x = find(x)
    y = find(y)
    if x == y:
        return False
    else:
        # sizeの大きい方をxとする
        if par[x] > par[y]:
            x, y = y, x
        par[x] += par[y]
        par[y] = x
        return True


# xとyが同じ集合か判定 def unite(x, y):
    x = find(x)
    y = find(y)
    if x == y:
        return False
    else:
        # sizeの大きい方をxとする
        if par[x] > par[y]:
            x, y = y, x
        par[x] += par[y]
        par[y] = x
        return True


# xとyが同じ集合か判定 unite y, z = map(int, input().split()) map(int, input().split()) y def is_same(x, y):
    return find(x) == find(y) def is_same(x, y):
    return find(x) == find(y) is_same def size(x):
    return -par[find(x)]


# 初期化
# 根なら-size、子なら親の頂点 def size(x):
    return -par[find(x)]


# 初期化
# 根なら-size、子なら親の頂点 size
import sys

input = sys.stdin.buffer.readline
n, m = map(int, input().split())


# union-find
# xの根を求める


def find(x):
    if par[x] < 0:
        return x
    else:
        par[x] = find(par[x])
        return par[x]


# xとyの属する集合の併合
def unite(x, y):
    x = find(x)
    y = find(y)
    if x == y:
        return False
    else:
        # sizeの大きい方をxとする
        if par[x] > par[y]:
            x, y = y, x
        par[x] += par[y]
        par[y] = x
        return True


# xとyが同じ集合か判定
def is_same(x, y):
    return find(x) == find(y)


def size(x):
    return -par[find(x)]


# 初期化
# 根なら-size、子なら親の頂点
par = [-1] * (n + 1)

for _ in range(m):
    x, y, z = map(int, input().split())
    unite(x, y)
ans = 0
for i in range(1, n + 1):
    if i == find(i):
        ans += 1
print(ans)
