#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
const int N = 1e3+5;
const int M = 2e3+5;
int n , m , p1[N] , p2[N] , in[N];
int head[N] , tot = 0;
struct edge{
int to , nxt;
}e[M*2];
bool color[N] , vis[N];
int match[N];
void add( int u , int v ){
e[++tot].to = v;
e[tot].nxt = head[u];
head[u] = tot;
}
void dfs( int u ){
if( vis[u] ) return;
vis[u] = 1;
for( int i = head[u] ; i ; i = e[i].nxt ){
int v = e[i].to;
color[v] = !color[u];
dfs( v );
}
}
int found( int u ){
if( vis[u] ) return 0;
vis[u] = 1;
for( int i = head[u] ; i ; i = e[i].nxt ){
int v = e[i].to;
if( match[v] == -1 || found( match[v] ) ){
match[v] = u;
return 1;
}
}
return 0;
}
int main( ) {
cin >> n >> m;
for( int i = 1 ; i <= m ; i++ ){
cin >> p1[i] >> p2[i];
p1[i]++;
p2[i]++;
in[p1[i]] = in[p2[i]] = 1;
add( p1[i] , p2[i] );
add( p2[i] , p1[i] );
}
for( int i = 1 ; i <= n ; i++ ){
if( !vis[i] && in[i] ) dfs( i );
}
memset( e , 0 , sizeof( e ) );
memset( head , 0 , sizeof( head ) );
tot = 0;
for( int i = 1 ; i <= m ; i++ ){
if( color[p1[i]] ){
swap( p1[i] , p2[i] );
}
add( p1[i] , p2[i] );
}
memset( match , -1 , sizeof( match ) );
int ans = 0;
for( int i = 1 ; i <= n ; i++ ){
if( !color[i] && in[i] ){
memset( vis , 0 , sizeof( vis ) );
ans += found( i );
}
}
cout << n-ans <<endl;
return 0;
}