#include <bits/stdc++.h>
using namespace std;
const char iname[] = "dfs.in";
const char oname[] = "d fs.out";
#define INF (1 << 30)
static constexpr int NMAX = (int)1e5 + 5;
vector<int> adj[NMAX];
void dfs(int node, vector<bool>& visited) {
visited[node] = true;
for (auto& neigh : adj[node]) {
if (!visited[neigh]) {
dfs(neigh, visited);
}
}
}
int main() {
ifstream in(iname);
int N, M;
in >> N >> M;
for (int i = 1, x, y; i <= M; ++i) {
in >> x >> y;
adj[x].push_back(y);
adj[y].push_back(x);
}
in.close();
vector<bool> visited(N + 1);
int conexComp = 0;
for (int i = 1; i <= N; ++i) {
if (!visited[i]) {
dfs(i, visited);
++conexComp;
}
}
ofstream out(oname);
out << conexComp;
out.close();
return 0;
}