#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int parent[N],sz[N];
void make(int v){
parent[v] = v;
sz[v]=1;
}
int find(int v){
if(v == parent[v]) return parent[v];
//path compression
parent[v]=find(parent[v]);
return parent[v];
}
void Union(int a, int b){
a=find(a);
b=find(b);
if(a!=b){
//union by size
if(sz[a]<sz[b])swap(a,b);
parent[b]=a;
sz[a]+=sz[b];
}
}
int main(){
int n,k;
cin>>n>>k;//number of nodes and edges
for(int i=1;i<=n;i++){
make(i);
}
while(k--)
{
int u,v;
cin>>u>>v;
Union(u,v);
}
int connected_components=0;
for(int i=1;i<=n;i++){
if(find(i)==i)connected_components++;
}
cout<<connected_components<<endl;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IE49MWU1KzEwOwoKaW50IHBhcmVudFtOXSxzeltOXTsKCnZvaWQgbWFrZShpbnQgdil7CnBhcmVudFt2XSA9IHY7CnN6W3ZdPTE7Cn0KCmludCBmaW5kKGludCB2KXsKaWYodiA9PSBwYXJlbnRbdl0pIHJldHVybiBwYXJlbnRbdl07Ci8vcGF0aCBjb21wcmVzc2lvbgogcGFyZW50W3ZdPWZpbmQocGFyZW50W3ZdKTsKcmV0dXJuIHBhcmVudFt2XTsKCn0KCnZvaWQgVW5pb24oaW50IGEsIGludCBiKXsKICAgIGE9ZmluZChhKTsKICAgIGI9ZmluZChiKTsKICAgIGlmKGEhPWIpewogICAgICAgIC8vdW5pb24gYnkgc2l6ZQogICAgICAgIGlmKHN6W2FdPHN6W2JdKXN3YXAoYSxiKTsKICAgICAgICBwYXJlbnRbYl09YTsKICAgICAgICBzelthXSs9c3pbYl07Cn0KfQppbnQgbWFpbigpewoKaW50IG4sazsKY2luPj5uPj5rOy8vbnVtYmVyIG9mIG5vZGVzIGFuZCBlZGdlcwpmb3IoaW50IGk9MTtpPD1uO2krKyl7CiAgICBtYWtlKGkpOwp9CndoaWxlKGstLSkKewogICAgaW50IHUsdjsKICAgIGNpbj4+dT4+djsKICAgIFVuaW9uKHUsdik7Cn0KaW50IGNvbm5lY3RlZF9jb21wb25lbnRzPTA7CmZvcihpbnQgaT0xO2k8PW47aSsrKXsKICAgIGlmKGZpbmQoaSk9PWkpY29ubmVjdGVkX2NvbXBvbmVudHMrKzsKfQpjb3V0PDxjb25uZWN0ZWRfY29tcG9uZW50czw8ZW5kbDsKCgp9