# coding: utf-8

# Your code here!

class UnionFind:

    def __init__(self, n):

        self.parent = list(range(n))#親ノード

        self.size = [1]*n #グループの要素数



    def root(self, x): #root(x): xの根ノードを返す．

        while self.parent[x] != x:

            self.parent[x] = self.parent[self.parent[x]]

            x = self.parent[x]

        return x 



    def merge(self, x, y): #merge(x,y): xのいるグループと$y$のいるグループをまとめる

        x = self.root(x)

        y = self.root(y)

        if x == y:

            return False

        if self.size[x] < self.size[y]: 

            self.size[y] += self.size[x] #yの要素数を更新

            self.parent[x] = y #xをyにつなぐ

        else:

            self.size[x] += self.size[y] #xの要素数を更新

            self.parent[y] = x #yをxにつなぐ

        return True



    def issame(self, x, y): #same(x,y): xとyが同じグループにあるならTrue

        return self.root(x) == self.root(y)

        

    def size(self,x): #size(x): xのいるグループの要素数を返す

        return self.size[self.root(x)]





n,m = [int(i) for i in input().split()]

 

T=UnionFind(n)

c=0

for _ in [0]*m:

    x,y,z=[int(i) for i in input().split()]

    if not T.issame(x-1,y-1):

        T.merge(x-1,y-1)

        c+=1

 

print((n-c))
# coding: utf-8

# Your code here!

class UnionFind:

    def __init__(self, n):

        self.parent = list(range(n))#親ノード

        self.size = [1]*n #グループの要素数



    def root(self, x): #root(x): xの根ノードを返す．

        while self.parent[x] != x:

            self.parent[x] = self.parent[self.parent[x]]

            x = self.parent[x]

        return x 



    def merge(self, x, y): #merge(x,y): xのいるグループと$y$のいるグループをまとめる

        x = self.root(x)

        y = self.root(y)

        if x == y:

            return False

        if self.size[x] < self.size[y]: 

            self.size[y] += self.size[x] #yの要素数を更新

            self.parent[x] = y #xをyにつなぐ

        else:

            self.size[x] += self.size[y] #xの要素数を更新

            self.parent[y] = x #yをxにつなぐ

        return True



    def issame(self, x, y): #same(x,y): xとyが同じグループにあるならTrue

        return self.root(x) == self.root(y)

        

    def size(self,x): #size(x): xのいるグループの要素数を返す

        return self.size[self.root(x)]





n,m = [int(i) for i in input().split()]

 

T=UnionFind(n)

c=0

for _ in [0]*m:

    x,y,z=[int(i) for i in input().split()]

    if T.merge(x-1,y-1):

        c+=1

 

print((n-c))
# coding: utf-8
# Your code here!
class UnionFind:
    def __init__(self, n):
        self.parent = list(range(n))  # 親ノード
        self.size = [1] * n  # グループの要素数

    def root(self, x):  # root(x): xの根ノードを返す．
        while self.parent[x] != x:
            self.parent[x] = self.parent[self.parent[x]]
            x = self.parent[x]
        return x

    def merge(self, x, y):  # merge(x,y): xのいるグループと$y$のいるグループをまとめる
        x = self.root(x)
        y = self.root(y)
        if x == y:
            return False
        if self.size[x] < self.size[y]:
            self.size[y] += self.size[x]  # yの要素数を更新
            self.parent[x] = y  # xをyにつなぐ
        else:
            self.size[x] += self.size[y]  # xの要素数を更新
            self.parent[y] = x  # yをxにつなぐ
        return True

    def issame(self, x, y):  # same(x,y): xとyが同じグループにあるならTrue
        return self.root(x) == self.root(y)

    def size(self, x):  # size(x): xのいるグループの要素数を返す
        return self.size[self.root(x)]


n, m = [int(i) for i in input().split()]
T = UnionFind(n)
c = 0
for _ in [0] * m:
    x, y, z = [int(i) for i in input().split()]
    if not T.issame(x - 1, y - 1):
        T.merge(x - 1, y - 1)
        c += 1
print((n - c))

# coding: utf-8
# Your code here!
class UnionFind:
    def __init__(self, n):
        self.parent = list(range(n))  # 親ノード
        self.size = [1] * n  # グループの要素数

    def root(self, x):  # root(x): xの根ノードを返す．
        while self.parent[x] != x:
            self.parent[x] = self.parent[self.parent[x]]
            x = self.parent[x]
        return x

    def merge(self, x, y):  # merge(x,y): xのいるグループと$y$のいるグループをまとめる
        x = self.root(x)
        y = self.root(y)
        if x == y:
            return False
        if self.size[x] < self.size[y]:
            self.size[y] += self.size[x]  # yの要素数を更新
            self.parent[x] = y  # xをyにつなぐ
        else:
            self.size[x] += self.size[y]  # xの要素数を更新
            self.parent[y] = x  # yをxにつなぐ
        return True

    def issame(self, x, y):  # same(x,y): xとyが同じグループにあるならTrue
        return self.root(x) == self.root(y)

    def size(self, x):  # size(x): xのいるグループの要素数を返す
        return self.size[self.root(x)]


n, m = [int(i) for i in input().split()]
T = UnionFind(n)
c = 0
for _ in [0] * m:
    x, y, z = [int(i) for i in input().split()]
    if T.merge(x - 1, y - 1):
        c += 1
print((n - c))

-    if not T.issame(x - 1, y - 1): -        T.merge(x - 1, y - 1) +    if T.merge(x - 1, y - 1):