#include using namespace std; using ll=long long; #define all(a) (a).begin(),(a).end() #ifdef DEBUG template ostream& operator << (ostream &out,vector a){ out<<'['; for(T x:a)out< vector ary(T *a,int l,int r){ return vector{a+l,a+1+r}; } template void debug(T x){ cerr< void debug(T x,S...y){ cerr<q; q.push(s); copy(head+s,head+1+t,cur+s); fill(d+s,d+1+t,-1),d[s]=0; for(int u;!q.empty();){ u=q.front(),q.pop(); for(int i=head[u];i;i=edge[i].nex){ int v=edge[i].to; if(edge[i].c&&!~d[v])d[v]=d[u]+1,q.push(v); } } return ~d[t]; } int dfs(int u,int lim=INF){ if(u==t)return lim; int flow=0; for(int i=cur[u];i&&flown&&!edge[i].c)match[u]=v-n; } } } } int tag[N]; void get(){ scanf("%d%d",&n,&m); int s=0,t=n+n+1; Flow::init(s,t); for(int i=1;i<=n;i++){ Flow::add(s,i,1),Flow::add(i+n,t,1); } fill(vis,vis+1+n,0); for(int u,v;m--;){ scanf("%d%d",&u,&v); Flow::add(u,v+n,1),Flow::add(v,u+n,1); vis[u]=vis[v]=1; } int cnt=Flow::dinic(); if(cnt!=n-1)return printf("%d\n",cnt*2-n),void(); Flow::find(); int u=0,v=0; fill(tag,tag+1+n,0); for(int i=1;i<=n;i++){ if(!match[i])u=i; else tag[match[i]]=1; } for(int i=1;i<=n;i++){ if(!tag[i])v=i; } if(u!=v||vis[u])printf("%d\n",cnt*2-n); else printf("%d\n",cnt*2-2-n); } int main(){ get(); return 0; }