#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
#define w1 first
#define w2 second
#define ls (x<<1)
#define rs (x<<1|1)
#define pb push_back
#define mid ((l+r)>>1)
#define SZ(x) ((x).size())
#define All(x) (x).begin(),(x).end()
#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define rep2(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
#define per(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)
#define Rep(p,x) for(int (p)=head[(x)];(p);(p)=nxt[(p)])
template<class T>void read(T&num){
	num=0;T f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
	num*=f;
}
int power(int x,int k,int p){int res=1;for(;k;k>>=1,x=1ll*x*x%p)if(k&1)res=1ll*res*x%p;return res;}
const int maxn=2e5+5;
int n,X,Y,tot;
int a[maxn],b[maxn],dep[maxn],fa[maxn][20];
int head[maxn],des[maxn<<1],nxt[maxn<<1];
int mark[maxn],q[maxn],mint[maxn],vis[maxn];
vector<int>e[maxn];
void adde(int x,int y){
	des[++tot]=y;nxt[tot]=head[x];head[x]=tot;
}
void dfs(int x){
	Rep(p,x)if(des[p]!=fa[x][0]){
		dep[des[p]]=dep[x]+1;
		fa[des[p]][0]=x;
		rep(i,1,19)fa[des[p]][i]=fa[fa[des[p]][i-1]][i-1];
		dfs(des[p]);
	}
}
int lca(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	per(i,19,0)if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
	if(x==y)return x;
	per(i,19,0)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
int dis(int x,int y){
	return dep[x]+dep[y]-2*dep[lca(x,y)];
}
void bfs(){
	int h=0,t=0,maxi=0;
	q[t++]=X;mint[X]=0;vis[X]=1;
	while(h!=t){
		int x=q[h++];
		maxi=max(maxi,dep[x]-1);
		if(mark[x]){
			puts("-1");
			return;
		}
		rep2(i,0,SZ(e[x])){
			int y=e[x][i];
			if(!vis[y]&&dep[y]-1>mint[x]+1)q[t++]=y,mint[y]=mint[x]+1,vis[y]=1;
		}
	}
	printf("%d\n",maxi<<1);
}
int main(){
	read(n);read(X);read(Y);
	rep(i,1,n-1)read(a[i]),read(b[i]);
	rep(i,1,n-1){
		int x,y;read(x);read(y);
		adde(x,y);adde(y,x);
	}
	dep[Y]=1;dfs(Y);
	rep(i,1,n-1){
		if(dis(a[i],b[i])>2)mark[a[i]]=mark[b[i]]=1;
		else e[a[i]].pb(b[i]),e[b[i]].pb(a[i]);
	}
	bfs();
	return 0;
}