#include #include #include #include #include #include #include #include #include #define INF 99999999 using namespace std; const int MAX=100+10; int dist[MAX],edgenum[MAX][MAX]; bool mark[MAX],flag[MAX][MAX][MAX]; int size,head[MAX],n,m,pos[3002],sum[MAX]; struct Edge{ int v,w,next; Edge(){} Edge(int V,int W,int Next):v(V),w(W),next(Next){} }edge[3002*2]; inline void Init(int num){ memset(head,-1,sizeof(int)*(num+2)); memset(edgenum,0,sizeof edgenum); memset(flag,false,sizeof flag); size=0; } inline void InsertEdge(int u,int v,int w){ edge[size]=Edge(v,w,head[u]); head[u]=size++; } int spfa(int s,bool p){ int ans=0; queueenqueue; for(int i=1;i<=n;++i)dist[i]=INF,mark[i]=false; dist[s]=0; mark[s]=true; enqueue.push(s); while(!enqueue.empty()){ int u=enqueue.front(); enqueue.pop(); mark[u]=false; for(int i=head[u];i != -1;i=edge[i].next){ int v=edge[i].v; if(dist[v]>dist[u]+edge[i].w){ dist[v]=dist[u]+edge[i].w; if(!mark[v]){ if(p)flag[s][u][v]=flag[s][v][u]=true; enqueue.push(v); mark[v]=true; } } } } for(int i=1;i<=n;++i){ if(dist[i] == INF)return INF; else ans+=dist[i]; } return ans; } int main(){ int ans,u,v,temp; while(cin>>n>>m){ Init(n); for(int i=0;i>u>>v; pos[i]=size; InsertEdge(u,v,1); InsertEdge(v,u,1); ++edgenum[u][v]; ++edgenum[v][u]; } ans=temp=0; for(int i=1;i<=n;++i){ sum[i]=spfa(i,1); if(sum[i] == INF){ans=INF;break;} else ans+=sum[i]; } for(int i=0;i0)cout<