#include <iostream>
#include <cstring>
using namespace std;
const int N = 5e5 + 10;
int e[N << 1], ne[N << 1], h[N], cnt;
void add(int a, int b){
e[cnt] = b, ne[cnt] = h[a], h[a] = cnt++;
}
int n, m, s;
// 用于预处理log(i) 的值
int lg[N];
int dep[N]; // 记录某节点的深度
int fa[N][20]; // 记录某节点的祖先节点; fa[u][0]是父节点
// dfs预处理出来fa数组
void dfs(int u, int pre){
dep[u] = dep[pre] + 1;
fa[u][0] = pre;
for (int i = 1; i <= (lg[dep[u]]); i++) {
// u的2^i个祖先是u的2^(i-1)个祖先的2^(i-1)个祖先
// 2^i = 2^(i-1) + 2^(i-1)
fa[u][i] = fa[fa[u][i-1]][i-1];
}
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if(j == pre) continue;
dfs(j, u);
}
}
int lca(int a, int b){
// 设a的深度较深
if(dep[a] < dep[b]) swap(a, b);
// 让a,b到同一深度
for (int i = lg[dep[a]]; i >= 0; i--) {
// 利用倍增让a向上走
// 如果a的2^i个父节点的深度大于等于b,则a向上走
if(dep[fa[a][i]] >= dep[b]) a = fa[a][i];
}
if(a == b) return a;
// 找出a和b的lca的直接子节点(即lca下面两个节点)
for (int i = lg[dep[a]]; i >= 0; i--) {
if(fa[a][i] != fa[b][i]){
a = fa[a][i], b = fa[b][i];
}
}
return fa[a][0]; // fa[b][0]
}
int main(){
memset(h, -1, sizeof h);
lg[1] = 0;
for (int i = 0; i < N; ++i) {
// lg 8 = lg7 + (1 << 3 == 8)
lg[i] = lg[i-1] + (1 << (lg[i-1] + 1) == i);
}
scanf("%d%d%d", &n, &m, &s);
int x, y;
for (int i = 0; i < n - 1; ++i) {
scanf("%d%d", &x, &y);
add(x, y);
add(y, x);
}
dep[s] = 0;
dfs(s, s);
int a, b;
for (int i = 0; i < m; ++i) {
scanf("%d%d", &a, &b);
// printf("%d %d\n", dep[a], dep[b]);
printf("%d\n", lca(a, b));
}
return 0;
}