#include <bits/stdc++.h>
#define MAXN 500005
using namespace std;
struct Edge {
int to, nxt;
} edge[MAXN << 1];
int head[MAXN], ecnt;
void add(int u, int v) {
edge[++ecnt].to = v;
edge[ecnt].nxt = head[u];
head[u] = ecnt;
}
int depth[MAXN], f[MAXN][22];
void dfs(int u, int fa) {
depth[u] = depth[fa] + 1;
f[u][0] = fa;
for (int i = 1; (1 << i) < depth[u]; i++) {
f[u][i] = f[f[u][i - 1]][i - 1];
}
for (int i = head[u]; i; i = edge[i].nxt) {
if (edge[i].to == fa) {
continue;
}
dfs(edge[i].to, u);
}
}
int LCA(int u, int v) {
if (depth[u] < depth[v]) {
swap(u, v);
}
for (int i = 20; i >= 0; i--) {
if (depth[u] - depth[v] >= (1 << i)) {
u = f[u][i];
}
}
if (u == v) {
return u;
}
for (int i = 20; i; i--) {
if (f[u][i] != f[v][i]) {
u = f[u][i], v = f[v][i];
}
}
return f[u][0];
}
int main() {
int n, m, root;
scanf("%d%d%d", &n, &m, &root);
for (int i = 1; i < n; i++) {
int x, y;
scanf("%d%d", &x, &y);
add(x, y), add(y, x);
}
dfs(root, 0);
for (int i = 1; i <= m; i++) {
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", LCA(x, y));
}
return 0;
}