10pts
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int N = 500050;
struct node {
int u, v, next;
} e[N*2];
int h[N], tot = 1;
void add(int x, int y) {
e[tot] = {x, y, h[x]};
h[x] = tot++;
e[tot] = {y, x, h[y]};
h[y] = tot++;
}
int f[22][N];
int dep[N];
int n, m, s;
void dfs(int x) {
for(int i=h[x]; i; i=e[i].next) {
int v = e[i].v;
if(v == f[0][x]) continue;
f[0][v] = x; dep[v] = dep[x] + 1;
dfs(v);
}
}
int lca(int a, int b) {
if(dep[a] > dep[b]) swap(a, b);
int x = dep[b] - dep[a];
for(int j=20; j>=0; --j) {
if(x >= (1<<j)) {
b = f[j][b]; x -= (1<<j);
}
}
for(int j=20; j>=0; --j) {
if(f[j][a] != f[j][b]) {
a = f[j][a]; b = f[j][b];
}
}
return f[0][b];
}
int main() {
//freopen("P3379_1.in", "r", stdin);
scanf("%d%d%d", &n, &m, &s);
for(int i=1; i<n; ++i) {
int x, y; scanf("%d%d", &x, &y);
add(x, y);
}
f[0][s] = s; dep[s] = 1;
dfs(s);
for(int j=1; j<=20; ++j) {
for(int i=1; i<=n; ++i) {
f[j][i] = f[j-1][f[j-1][i]];
}
}
for(int i=1; i<=m; ++i) {
int a, b; scanf("%d%d", &a, &b);
printf("%d\n", lca(a, b));
}
return 0;
}