#include <vector>
#include <iostream>
using namespace std;
	
	int n, m;	// орой болон ирмэгийн тоо
	int comp;	// бидний хариу буюу компонентийн тоо
	bool vis[200000];	// ирсэн ирээгүйг хадгалах массив
	vector<int> adj[200000];	// графын мэдээллийг хадгалах вектор

void dfs(int u) {
	// одоо бид u гэсэн орой дээр ирж байгаа тул
	vis[u] = 1; // ирсэн гэж тэмдэглэнэ

	for(int v:adj[u]) {
		// v:adj[u] гэдэг нь v гэсэн тоо нь adj[u] гэсэн векторт байгаа
		// бүх элемэнтийн утгыг авна гэсэн үг ба эхнээс нь дуустал явна		 
		if( !vis[v] ) {
			// v гэсэн орой дээр өмнө нь ямар нэгэн байдлаар очоогүй бол
			// энэ оройгоос цааш явах ёстой гэсэн үг
			dfs(v);
		}
	}
}

int main() {
	cin >> n >> m; 
	while( m-- ) {
		int u, v;	// u, v 2 орой хоорондоо шууд ирмэгээр 
					// холбогддог гэсэн үг
		cin >> u >> v;
		adj[u].push_back( v );
		adj[v].push_back( u );
	}

	for(int i = 1; i <= n; i++) {
		if( !vis[i] ) {
			// Энэ нь I-р орой дээр өмнө ямар нэгэн байдлаар очиж чадаагүй
			// гэсэн үг тул энэ оройг агуулсан нэг компонент байх нь 
			// тодохрой тул компонентын тоо нь 1-р нэмэгдэнэ
			comp++;
			dfs( i );	// энэ оройтой ямар нэгэн байдлаар холбогдсон бүх 
						// орой нь энэ компонетэд орно.

		}
	}
	cout << comp << endl; // хариуг хэвлэнэ.
	return 0;
}