//警察抓到了n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,
//但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。
//有可能一个犯罪团伙只有一个人。请你根据已知罪犯之间的关系,确定犯罪团伙的数量。已知罪犯的编号从1至n。
//输入:
//第一行:n(<=10000,罪犯数量),
//第二行:m(<=100000,关系数量)
//以下m行:每行两个数:I 和j,中间一个空格隔开,表示罪犯i和罪犯j相互认识。
//输出:一个整数,犯罪团伙的数量。
#include <iostream>
using namespace std;
const int maxn = 100001;
int father[maxn] = {0};
int find(int i) {
if (father[i] == 0) return i;
if (father[father[i]] == 0) return father[i];
int pos = find (father[i]);
father[i] = pos; //路径压缩
return pos;//返回父亲的值
}
int main() {
int n,m,q,p,x,y;
cin >> n >> m;
for (int i = 0;i < m; i++) {
cin >> x >> y;
p = find (x);
q = find (y);
if (p != q) father[p] = q;
}
int ans = 0;
for (int i = 0;i < n; i++) {
if (father[i] == 0) ans++;
}
cout << ans << endl;
}