#include <bits/stdc++.h>

using namespace std;

const int maxn = 200010;

int n, X, Y;
int tag[maxn], vis[maxn];

struct Tree {
	int l[maxn], dep[maxn], fa[maxn][20], e, r;

	Tree() {memset(l, -1, sizeof(l));}

	struct Edge {
		int v, x;
	} E[maxn<<1];

	inline void addEdge(int u, int v) {
		E[e].v = v, E[e].x = l[u], l[u] = e++;
		E[e].v = u, E[e].x = l[v], l[v] = e++;
	}

	void dfs(int u, int f) {
		fa[u][0] = f;
		for (int i = 1; i < 20; i++) fa[u][i] = fa[fa[u][i-1]][i-1];
		for (int p = l[u]; p >= 0; p = E[p].x) {
			int v = E[p].v;
			if (v != f) {
				dep[v] = dep[u] + 1;
				dfs(v, u);
			}
		}
	}

	void init(int rt) {
		r = rt;
		dfs(r, 0);
	}

	int lca(int u, int v) {
		if (dep[u] < dep[v]) swap(u, v);
		if (dep[u] > dep[v]) {
			int c = dep[u] - dep[v];
			for (int i = 0; i < 20; i++) {
				if (c & (1 << i)) {
					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];
	}

	int dis(int u, int v) {
		return dep[u] + dep[v] - 2 * dep[lca(u, v)];
	}
} T1, T2;

void dfs_vis(int u, int f) {
	vis[u] = 1;
	for (int p = T1.l[u]; p >= 0; p = T1.E[p].x) {
		int v = T1.E[p].v;
		if (v != f) {
			// 此时 Y 的深度为 T1.dep[u]
			if (T2.dep[v] > T1.dep[u] + 1) {
				dfs_vis(v, u);
			}
		}
	}
}

int main() {
	scanf("%d%d%d", &n, &X, &Y);
	for (int i = 1; i < n; i++) {
		int a, b;
		scanf("%d%d", &a, &b);
		T1.addEdge(a, b);
	}
	for (int i = 1; i < n; i++) {
		int c, d; 
		scanf("%d%d", &c, &d);
		T2.addEdge(c, d);
	}
	T1.init(X), T2.init(Y);
	for (int u = 1; u <= n; u++) {
		for (int p = T1.l[u]; p >= 0; p = T1.E[p].x) {
			int v = T1.E[p].v;
			if (T2.dis(u, v) > 2) {
				tag[u] = 1;
			}
		}
	}
	dfs_vis(X, 0);
	int ans = 0;
	for (int u = 1; u <= n; u++) {
		if (vis[u]) {
			if (tag[u]) ans = 0x3f3f3f3f;
			else ans = max(ans, T2.dep[u]);
		}
	}
	if (ans < 0x3f3f3f3f) printf("%d\n", ans << 1);
	else puts("-1");
	return 0;
}