//by yjz
#include<bits/stdc++.h>
using namespace std;
#define FF first
#define SS second
#define PB push_back
#define MP make_pair
#define bged(v) (v).begin(),(v).end()
#define foreach(it,s) for(__typeof((s).begin()) it=(s).begin();it!=(s).end();it++)
typedef long long ll;
const int Imx=2147483647;
const ll Lbig=2e18;
const int mod=1e9+7;
//My i/o stream
struct fastio
{
	char s[100000];
	int it,len;
	fastio(){it=len=0;}
	inline char get()
	{
		if(it<len)return s[it++];it=0;
		len=fread(s,1,100000,stdin);
		if(len==0)return EOF;else return s[it++];
	}
	bool notend()
	{
		char c=get();
		while(c==' '||c=='\n')c=get();
		if(it>0)it--;
		return c!=EOF;
	}
}_buff;
#define geti(x) x=getnum()
#define getii(x,y) geti(x),geti(y)
#define getiii(x,y,z) getii(x,y),geti(z)
#define puti(x) putnum(x),putchar(' ')
#define putii(x,y) puti(x),puti(y)
#define putiii(x,y,z) putii(x,y),puti(z)
#define putsi(x) putnum(x),putchar('\n')
#define putsii(x,y) puti(x),putsi(y)
#define putsiii(x,y,z) putii(x,y),putsi(z)
inline ll getnum()
{
	ll r=0;bool ng=0;char c;c=_buff.get();
	while(c!='-'&&(c<'0'||c>'9'))c=_buff.get();
	if(c=='-')ng=1,c=_buff.get();
	while(c>='0'&&c<='9')r=r*10+c-'0',c=_buff.get();
	return ng?-r:r;
}
template<class T> inline void putnum(T x)
{
	if(x<0)putchar('-'),x=-x;
	register short a[20]={},sz=0;
	while(x)a[sz++]=x%10,x/=10;
	if(sz==0)putchar('0');
	for(int i=sz-1;i>=0;i--)putchar('0'+a[i]);
}
inline char getreal(){char c=_buff.get();while(c<=32)c=_buff.get();return c;}
ll qpow(ll x,ll k){return k==0?1:1ll*qpow(1ll*x*x%mod,k>>1)*(k&1?x:1)%mod;}
ll ANS;
int n,m,fa[100111],lv[100111];
vector<int> con[100111];
int deg[100111];
int col[100111];
int ex,ey;
void pdfs(int x,int c,int pre=-1)
{
	col[x]=c;
	if(c==2)deg[x]++;else deg[x]--;
	for(int i=0;i<con[x].size();i++)
	{
		int u=con[x][i];
		if(u==pre)continue;
		if(!col[u])
		{
			lv[u]=lv[x]+1;
			fa[u]=x;
			pdfs(u,c^1,x);
		}
		else ex=x,ey=u;
	}
}
vector<int> C;
bool cyc[100111];
int dfs(int x,int pre)
{
	int ret=deg[x];
	for(int i=0;i<con[x].size();i++)
	{
		int u=con[x][i];
		if(u==pre)continue;
		if(cyc[u]||col[u]==col[x])continue;
		int t=dfs(u,x);
		ret+=t;
		ANS+=abs(t);
	}
	return ret;
}
int getlca(int x,int y)
{
	if(lv[x]<lv[y])swap(x,y);
	while(lv[x]>lv[y])x=fa[x];
	while(x!=y)x=fa[x],y=fa[y];
	return x;
}
void addpath(int x,int p){while(x!=p)C.PB(x),cyc[x]=1,x=fa[x];}
void findcyc(int x,int y)
{
	int p=getlca(x,y);
	addpath(x,p);
	int sz=C.size();
	addpath(y,p);
	C.PB(p);cyc[p]=1;
	reverse(C.begin()+sz,C.end());
}

int main()
{
	getii(n,m);
	for(int i=1;i<=m;i++)
	{
		int x,y;
		getii(x,y);
		con[x].PB(y);
		con[y].PB(x);
	}
	pdfs(1,2);
//	for(int i=1;i<=n;i++)cerr<<deg[i]<<" ";cerr<<endl;
	if(m==n-1)
	{
		int pp=dfs(1,-1);
		if(pp==0)cout<<ANS<<endl;else puts("-1");
	}
	else
	{
		int sum=0;
		for(int i=1;i<=n;i++)
		{
			sum+=deg[i];
		}
		if(deg[ex]==deg[ey])
		{
			if(sum%2!=0)
			{
				puts("-1");
			}
			else
			{
				deg[ex]+=(-sum)/2;
				deg[ey]+=(-sum)/2;
				dfs(1,-1);
				ANS+=abs(sum)/2;
				cout<<ANS<<endl;
			}
		}
		else
		{
			if(sum!=0)
			{
				puts("-1");
			}
			else
			{
				static int a[100111];
				findcyc(ex,ey);
//				cerr<<"cyc:"<<endl;
//				for(int i=0;i<C.size();i++)cerr<<C[i]<<" ";cerr<<endl;
				int cn=C.size();
				for(int i=0;i<C.size();i++)
				{
					a[i]=dfs(C[i],-1);
				}
				assert(cn%2==0);
				int t=0;
				vector<int> v;
				for(int i=0;i<cn;i++)
				{
					t-=a[i];
//					cerr<<"t="<<t<<endl;
					v.PB(t);
				}
				nth_element(v.begin(),v.begin()+cn/2,v.end());
				int X=-v[cn/2];
				for(int i=0;i<cn;i++)
				{
					X-=a[i];
					ANS+=abs(X);
				}
				cout<<ANS<<endl;
			}
		}
	}
	return 0;
}


Measured memory_bytes: 16888