#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <stack>
#include <queue>
#define rep(i,l,r) for(int i=(l);i<=(r);++i)
#define per(i,r,l) for(int i=(r);i>=(l);--i)
#define pb push_back
using namespace std;
const int maxn=2e5+10;
int n,x,y,u[maxn],v[maxn],dep[maxn],fa[maxn][19],len[maxn],ans;
vector<int> G[maxn],H[maxn];bool vis[maxn],hry[maxn];
void dfs(int u){for(int v:G[u]) if(v^fa[u][0]) dep[v]=dep[u]+1,fa[v][0]=u,dfs(v);}
int lca(int u,int v){
	if(dep[u]<dep[v]) swap(u,v);
	if(dep[u]^dep[v]){int t=dep[u]-dep[v];rep(i,0,18) if(t&(1<<i)) u=fa[u][i];}
	if(u==v) return u;
	per(i,18,0) if(fa[u][i]^fa[v][i]) u=fa[u][i],v=fa[v][i];
	return fa[u][0];
}
int dis(int x,int y){return dep[x]+dep[y]-2*dep[lca(x,y)];}
void dfs2(int u){
	vis[u]=1;
	for(int v:H[u]) if(!vis[v]&&(dep[v]>len[u]+1)) len[v]=len[u]+1,dfs2(v);
}
int main(){
	scanf("%d%d%d",&n,&x,&y);
	rep(i,1,n-1) scanf("%d%d",&u[i],&v[i]);
	rep(i,1,n-1){int u,v;scanf("%d%d",&u,&v);G[u].pb(v);G[v].pb(u);}
	dfs(y);rep(i,1,18) rep(j,1,n) if(fa[j][i-1]) fa[j][i]=fa[fa[j][i-1]][i-1];
	rep(i,1,n-1) 
		if(dis(u[i],v[i])<=2) H[u[i]].pb(v[i]),H[v[i]].pb(u[i]);
		else hry[u[i]]=hry[v[i]]=1;
	dfs2(x);
	rep(i,1,n)
		if(vis[i]&&hry[i]) return puts("-1"),0;
		else if(vis[i]) ans=max(ans,dep[i]<<1);
	printf("%d\n",ans);
	return 0;
}