#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
const int M = 2e5 + 10;
bool f;
struct Edge{
    int to,nex;
}e[M];
int head[N],idx,color[N];
void add_edge(int u,int v){
    e[idx].to = v;
    e[idx].nex = head[u];
    head[u] = idx++;
}

void dfs(int u,int fa){
    for(int i = head[u];~i;i = e[i].nex){
        int v = e[i].to;
        if(v == fa) continue;
        if(color[v]){
            if(color[v] == color[u]) f = 1;
            continue;
        }    
        color[v] = -color[u];
        dfs(v,u);
    }
}

int cnt,n,m;
int main(){
    memset(head,-1,sizeof(head));
    scanf("%d%d",&n,&m);
    while(m--){
        int u,v;scanf("%d%d",&u,&v);
        add_edge(u,v),add_edge(v,u);
    }
    for(int i = 1;i <= n;i++){
        if(!color[i]){
            color[i] = 1;
            dfs(i,0);
            cnt++;//连通块数量 
        }
    }
    if(f) printf("%d\n",cnt - 1);
    else printf("%d\n",cnt);
    return 0;
}