#include<cstdio>
using namespace std;
const int N=1e5+5;
struct Link{int to,nxt;}l[N<<1];
int n,m,a[N],head[N],tot=1;
int fa[N],edge,rt;
inline int read(){
	int s=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') f=ch=='-'?-1:f,ch=getchar();
	while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
	return s*f;
}
inline void add(int x,int y){
	l[++tot].to=y;l[tot].nxt=head[x];head[x]=tot;
}
int find(int x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void dfs(int x,int fa,int opt){
	a[x]=opt;
	for(int i=head[x];i;i=l[i].nxt){
		int y=l[i].to;
		if(y==fa) continue;
		dfs(y,x);a[x]+=a[y];
	}
}
int st[N],in[N],top;
void get_roof(int x,int fa){
	in[st[++top]=x]=1;
	for(int i=head[x];i;i=l[i].nxt){
		int y=l[i].to;
		if(y==fa) continue;
		if(in[y]){
			edge=i;rt=x;
			do{
				
			}while()
		}
		else get_roof(y,x);
	}
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;++i){
		int x=read(),y=read();
		add(x,y),add(y,x);
	}
	dfs(rt,0);
	if(n==m){
		if()
	}
	else if(a[rt]) return puts("-1"),0;
	int res=0;
	for(int i=1;i<=n;++i) res+=abs(a[i]);
}