/*
Your task is to divide the students into two groups so that any two students in the same group don't know each other.
也即問是否存在二分圖 ,通過判斷是否有奇數長度回路即可 dfs一下
當然,允許多棵森林
then arrange them into double rooms 相識的同一間房,即求最大匹配
*/
#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;//層次相差為偶數,即偶數回路
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;
}