#include "bits/stdc++.h"
using namespace std;
const int z = 131024;
//又是一个基于dfs的算法;
int n, m;
struct EDGE {
int t, next;
} edge[z<<1];
int head[z], cnt, color[z];
void add_edge(int f,int t) {
edge[++cnt].next = head[f];
edge[cnt].t = t;
head[f] = cnt;
}
//判断是否为二分图;
bool jd_dfs(int u,int p,int c) {
color[u] = c;
for(int i = head[u];i;i = edge[i].next) {
if(edge[i].t == p) continue;
if(!color[edge[i].t])
if(!jd_dfs(edge[i].t,u,3-c))
return false;
if(color[edge[i].t] == c)
return false;
}
return true;
}
bool judge() {
bool flag = true;
for(int i = 1;i <= n;++i)
if(!color[i]&&!jd_dfs(i,0,1)) {
flag = false;
break;
}
return flag;
}
//匈牙利算法;
int match[z];
bool visit[z];
bool hr_dfs(int u) {
for(int i = head[u];i;i = edge[i].next) {
if(!visit[edge[i].t]) {
visit[edge[i].t] = true;
if(!match[edge[i].t]||hr_dfs(match[edge[i].t])) {
match[edge[i].t] = u;
return true;
}
}
}
return false;
}
int hungarian() {
int ans = 0;
for(int i = 1;i <= n;++i) {
memset(visit,false,sizeof(visit));
if(hr_dfs(i)) ++ans;
}
return ans;
}
int main() {
scanf("%d %d",&n,&m);
for(int i = 1, f, t;i <= m;++i) {
scanf("%d %d",&f,&t);
add_edge(f,t);
add_edge(t,f);
}
if(judge()) printf("%d\n",hungarian()/2);
else printf("false\n");
}
/*
10 13
1 5
1 6
1 8
1 10
2 6
2 7
2 8
2 9
3 5
3 10
4 5
4 6
4 10
*/
@bikuhiku