/*
Your task is to divide the students into two groups so that any two students in the same group don't know each other.
也即問是否存在二分圖 ,通過判斷是否有奇數(shù)長(zhǎng)度回路即可 dfs一下
當(dāng)然,允許多棵森林
then arrange them into double rooms 相識(shí)的同一間房,即求最大匹配
*/
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN=210;
struct Node{
int v,next;
}nodes[MAXN*MAXN];
int G[MAXN];
int link[MAXN];
int n,m,alloc;
int vi[MAXN];
void add(int a,int b){
alloc++;
nodes[alloc].v=b,nodes[alloc].next=G[a];
G[a]=alloc;
}
bool dfs(int u,int p){
for(int son=G[u];son;son=nodes[son].next){
int v=nodes[son].v;
if(v==p)continue;
if(vi[v]!=-1){
if(vi[v]==vi[u])return false;//層次相差為偶數(shù),即偶數(shù)回路
continue;
}
vi[v]=1-vi[u];
if(!dfs(v,u))return false;
}
return true;
}
bool find(int u){
for(int son=G[u];son;son=nodes[son].next){
int v=nodes[son].v;
if(vi[v])continue;
vi[v]=1;
if(!link[v]||find(link[v])){
link[v]=u;
return true;
}
}
return false;
}
int main(){
//freopen("in","r",stdin);
int a,b;
while(~scanf("%d%d",&n,&m)){
alloc=0;
memset(G,0,sizeof(G));
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
memset(vi,-1,sizeof(vi));
bool flag=false;
for(int i=1;i<=n;i++)
if(vi[i]==-1){
vi[i]=1;
if(!dfs(i,i)){
flag=true;
break;
}
}
if(flag){printf("No\n");continue;}
int ans=0;
memset(link,0,sizeof(link));
for(int i=1;i<=n;i++){
memset(vi,0,sizeof(vi));
ans+=find(i);
}
printf("%d\n",ans/2);
}
return 0;
}