#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int N,M,S;
vector<int> tree[500005];
int d[500005];
int f[500005][22];
void bfs(){
queue<int> q;
q.push(S);
d[S] = 1;
while(!q.empty()){
int node = q.front();
q.pop();
for(int i = 0;i<tree[node].size();i++){
int cnode = tree[node][i];
if(d[cnode])continue;
d[cnode] = d[node]+1;
f[cnode][0] = node;
for(int k = 20;k>=1;k--){
f[cnode][k] = f[f[cnode][k-1]][k-1];
}
q.push(cnode);
}
}
}
int lca(int x,int y){
if(d[x] > d[y])swap(x,y);
for(int k = 20;k>=0;k--){
if(d[f[y][k]] >= d[x]){
y = f[y][k];
}
}
if(x == y) return x;
for(int k = 20;k>=0;k--){
if(f[y][k] != f[x][k]){
y = f[y][k];
x = f[x][k];
}
}
return f[x][0];
}
int main(){
cin >> N >> M >> S;
for(int i = 1;i<=N-1;i++){
int x,y;
scanf("%d%d",&x,&y);
tree[x].push_back(y);
tree[y].push_back(x);
}
bfs();
for(int i = 1;i<=M;i++){
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",lca(a,b));
}
return 0;
}