/*
考虑对树的深度奇偶分类，然后再在奇数层放球。
定义一个点的颜色(0/1) = 深度奇偶性 xor 球的有无；
容易得到初始状态是全 0，每次操作等价于球往相邻空位移动。

比较容易构造出最优的策略，每条边都贴下界。 
也就是说设有球点权 = 1，空位点权 = -1，
则 u 的子树和 sum 等价于 u->fa 移动球的次数(若 sum<0 则代表 fa->u )。 

考虑如果有奇环

偶环 
*/
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

const int N=100005;

int n,m,S,T,dep[N],fa[N],ord,dfn[N],f[N];
vector<int>G[N];
long long ans;

void link(int a,int b)
{
	G[a].push_back(b);
	G[b].push_back(a);
}

void dfs(int u,int par)
{
	fa[u]=par;
	dfn[u]=++ord;
	for(auto &v:G[u])
		if(v^par)
		{
			if(!dfn[v])
			{
				dep[v]=dep[u]+1;
				dfs(v,u);
			}
			else if(dfn[v]<dfn[u])
			{
				S=u;
				T=v;
			}
		}
}

void dfs1(int u)
{
	f[u]=dep[u]&1?1:-1;
	for(auto &v:G[u])
		if(fa[v]==u)
			dfs1(v),f[u]+=f[v];
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1,a,b; i<=m; i++)
	{
		scanf("%d%d",&a,&b);
		link(a,b);
	}
	dep[1]=1;
	dfs(1,0);
	dfs1(1);
	if(n>m)
	{
		if(f[1])
			return puts("-1"),0;
	}
	else
	{
		if(dep[S]%2==dep[T]%2)
		{
			if(f[1]%2)
				return puts("-1"),0;
			ans+=abs(f[1]/2);
			for(int x=S; x!=T; x=fa[x])
				f[x]-=f[1]/2;
			for(int x=T; x; x=fa[x])
				f[x]-=f[1];
		}
		else
		{
			if(f[1])
				return puts("-1"),0;
			vector<int> v;
			for(int x=S; x!=T; x=fa[x])v.push_back(f[x]);
			v.push_back(0);
			nth_element(v.begin(),v.begin()+v.size()/2,v.end());
			int F=v[v.size()/2];
			ans+=abs(F);
			for(int x=S; x!=T; x=fa[x])f[x]-=F;
		}
	}
	for(int i=1; i<=n; i++)
		ans+=f[i]<0?-f[i]:f[i];
	printf("%lld\n",ans);
	return 0;
}
