#include<bits/stdc++.h>
using namespace std;

long long ans=0;
int n,m,x,y,S,T,k[100005],siz[100005];
int s[100005],top;
bool odd;

vector<list<int> > graph;

void dfs1(int p,int fa)
{
	for(list<int>::iterator i=graph[p].begin();i!=graph[p].end();i++)
	{
		if(*i==fa) continue;
		if(siz[*i])
		{
			if(siz[p]==siz[*i]) odd=true;
			S=p,T=*i;
		}
		else
		{
			siz[*i]=-siz[p];
			dfs1(*i,p);
		}
	}
	return;
}

void dfs2(int p,int fa)
{
	for(list<int>::iterator i=graph[p].begin();i!=graph[p].end();i++)
	{
		if(*i==fa||(p==S&&*i==T)||(p==T&&*i==S)) continue;
		dfs2(*i,p);
		siz[p]+=siz[*i];
		k[p]+=k[*i];
	}
	return;
}

int main()
{
	scanf("%d%d",&n,&m);
	graph.resize(n+1);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		graph[x].push_back(y);
		graph[y].push_back(x);
	}
	siz[1]=1,dfs1(1,0);
	int sum=0;
	for(int i=1;i<=n;i++) sum+=siz[i];
	if(m==n-1)
	{
		if(sum) return puts("-1"),0;
	}
	else if(odd)
	{
		if(sum&1) return puts("-1"),0;
		ans+=abs(sum>>1);
		siz[S]-=sum>>1,siz[T]-=sum>>1;
	}
	else if(sum) return puts("-1"),0;
		else k[S]=1,k[T]=-1;
	dfs2(1,0);
	for(int i=1;i<=n;i++)
	{
		if(k[i]) s[++top]=k[i]*siz[i];
		else ans+=abs(siz[i]);
	}
	s[++top]=0;
	sort(s+1,s+top+1);
	int mid=s[top+1>>1];
	for(int i=1;i<=top;i++) ans+=abs(s[i]-mid);
	printf("%lld\n",ans);
	return 0;
}