#include"bits/stdc++.h"


#define PB push_back
#define PF push_front
#define LB lower_bound
#define UB upper_bound
#define fr(x) freopen(x,"r",stdin)
#define fw(x) freopen(x,"w",stdout)
#define iout(x) printf("%d\n",x)
#define lout(x) printf("%lld\n",x)
#define REP(x,l,u) for(ll x = (l);x<=(u);x++)
#define RREP(x,l,u) for(ll x = (l);x>=(u);x--)
#define mst(x,a) memset(x,a,sizeof(x))
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define MP make_pair
#define se second
#define fi first
#define dbg(x) cout<<#x<<" = "<<(x)<<endl;
#define sz(x) ((int)x.size())
#define cl(x) x.clear()

typedef  long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ld;
using namespace std;

const int maxn = 100010;
const int mod = 1e9+7;
const int MAX = 1000000010;
const double eps = 1e-6;
const double PI = acos(-1);

template<typename T> inline void read(T &x){
x=0;T f=1;char ch;do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');do x=x*10+ch-'0',ch=getchar();while(ch<='9'&&ch>='0');x*=f;
}

template<typename A,typename B> inline void read(A&x,B&y){read(x);read(y);}
template<typename A,typename B,typename C> inline void read(A&x,B&y,C&z){read(x);read(y);read(z);}
template<typename A,typename B,typename C,typename D> inline void read(A&x,B&y,C&z,D&w){read(x);read(y);read(z);read(w);}
template<typename A,typename B> inline A fexp(A x,B p){A ans=1;for(;p;p>>=1,x=1LL*x*x%mod)if(p&1)ans=1LL*ans*x%mod;return ans;}
template<typename A,typename B> inline A fexp(A x,B p,A mo){A ans=1;for(;p;p>>=1,x=1LL*x*x%mo)if(p&1)ans=1LL*ans*x%mo;return ans;}

int n,m;

namespace Tree{
	
	vector<int> G[maxn];
	
	int V[maxn];
	
	void dfs(int u,int f,int dep){
		if(dep&1)V[u]=1;else V[u]=-1;
		for(auto v:G[u])if(v!=f){
			dfs(v,u,dep+1);
			V[u]+=V[v];
		}
	}
	
	void solve(){
		REP(i,2,n){
			int u,v;
			read(u,v);
			G[u].PB(v);G[v].PB(u);
		}
		dfs(1,0,1);
		if(V[1]){
			puts("-1");
		}
		else{
			ll ans=0;
			REP(i,1,n)ans+=abs(V[i]);
			cout<<ans<<endl;
		}
	}
};

namespace Circle{
	
	int U[maxn],V[maxn];
	
	vector<int> G[maxn];
	
	int col[maxn];
	
	int fa[maxn];
	
	int find(int i){return fa[i]==i?i:fa[i]=find(fa[i]);}
	
	void dfs(int u,int c){
		if(col[u])return;
		col[u]=c;
		for(auto v:G[u])dfs(v,-c);
	}
	
	namespace Odd{
		
		int f[maxn];
		
		void dfs(int u,int fa){
			f[u]=col[u];
			for(auto v:G[u])if(v!=fa){
				dfs(v,u);
				f[u]+=f[v];
			}
		}
		
		void solve(){
			int tot=0;
			REP(i,1,n)tot+=col[i];
			if(tot&1){
				puts("-1");
			}
			else{
				col[U[m]]-=tot/2;
				col[V[m]]-=tot/2;
				
				dfs(1,0);
				ll ans=0;
				REP(i,1,n)ans+=abs(f[i]);
				cout<<ans+abs(tot/2)<<endl;
			}
		}
	}
	
	namespace Even{
		
		PII f[maxn];
		
		int has[maxn];
		
		void dfs(int u,int fa){
			f[u].fi=col[u];
			if(u==U[n])f[u].se=1;
			if(u==V[n])f[u].se=-1;
			for(auto v:G[u])if(v!=fa){
				dfs(v,u);
				f[u].fi+=f[v].fi;
				f[u].se+=f[v].se;
			}
		}
		
		void solve(){
			int tot=0;
			REP(i,1,n)tot+=col[i];
			if(tot){
				puts("-1");
			}
			else{
				dfs(1,0);
				ll ans=0;
				int cnt=0;
				REP(i,1,n)if(!f[i].se)ans+=abs(f[i].fi);else has[++cnt]=f[i].se*f[i].fi;
				has[++cnt]=0;
				sort(has+1,has+cnt+1);
				REP(i,1,cnt)ans+=abs(has[i]-has[(cnt+1)/2]);
				cout<<ans<<endl;
			}
		}
	}
	
	void solve(){
		REP(i,1,n)read(U[i],V[i]);
		REP(i,1,n)fa[i]=i;
		REP(i,1,m){
			if(find(U[i])==find(V[i])){
				swap(U[i],U[m]);
				swap(V[i],V[m]);
				break;
			}
			else fa[find(U[i])]=find(V[i]);
		}
		REP(i,1,n-1)G[U[i]].PB(V[i]),G[V[i]].PB(U[i]);
		dfs(1,1);
		if(col[U[m]]==col[V[m]])Odd::solve();
		else Even::solve();
	}
}

void Work(){
	if(n==m+1)Tree::solve();
	else Circle::solve();
}

void Init(){
	read(n,m);
}

int main(){
	Init();
	Work();
	return 0;
}


Measured memory_bytes: 17024