#include<bits/stdc++.h>
using namespace std;
template<class T> inline bool chkmax(T& a,T b){return a<b?a=b,1:0;}
template<class T> inline bool chkmin(T& a,T b){return a>b?a=b,1:0;}
template<typename T> inline T& read(T& x){
    static char c; bool flag=0;
    while(!isdigit(c=getchar())) if(c=='-') flag=1;
    for(x=c-'0';isdigit(c=getchar());(x*=10)+=c-'0');
    if(flag) x=-x;
    return x;
}
const int maxn=200010;
int n,A,B;
int head[maxn],nxt[maxn<<1],to[maxn<<1],e;
int head2[maxn],nxt2[maxn<<1],to2[maxn<<1],e2;
struct Edge{
	int u,v;
} E[maxn];
void ae(int x,int y){
    to[++e]=y; nxt[e]=head[x]; head[x]=e;
}
void ae2(int x,int y){
    to2[++e2]=y; nxt2[e2]=head2[x]; head2[x]=e2;
}
int fa[maxn][20],dep[maxn];
void dfs(int u){
    for(int i=1;i<20;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
    for(int i=head[u];i;i=nxt[i]){
        int v=to[i];
        if(v!=fa[u][0]){
            fa[v][0]=u; dep[v]=dep[u]+1; dfs(v);
        }
    }
}
int lca(int u,int v){
    if(dep[u]<dep[v]) swap(u,v);
    for(int i=19;i>=0;i--) if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
    if(u==v) return u;
    for(int i=19;i>=0;i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
    return fa[u][0];
}
bool p[maxn];
int ans;
void dfs2(int u,int d,int f){
    if(d>=dep[u]) return;
    chkmax(ans,dep[u]<<1);
    if(p[u]) cout<<-1<<endl,exit(0);
    for(int i=head2[u];i;i=nxt2[i]){
        int v=to2[i];
        if(v!=f) dfs2(v,d+1,u);
    }
}
int main(){
    read(n); read(A); read(B);
    for(int i=1;i<n;i++){
        int u,v;
        read(u); read(v);
        ae2(u,v); ae2(v,u);
		E[i].u=u; E[i].v=v;
    }
    for(int i=1;i<n;i++){
        int u,v;
        read(u); read(v);
        ae(u,v); ae(v,u);
    }
    dfs(B);
	for(int i=1;i<n;i++) if(dep[E[i].u]+dep[E[i].v]-2*dep[lca(E[i].u,E[i].v)]>=3) p[E[i].u]=p[E[i].v]=1;
    dfs2(A,0,0);
    cout<<ans<<endl;
    return 0;
}