#include <bits/stdc++.h>
using namespace std;
const int N=5e6,DEP=20;
int cnt,a,b,n,m,root,head[2*N],old[N][DEP+1],deep[N];
struct Node{
int to,next;
}edge[2*N];
void in(){
for(int i=0;i<2*n;i++){
edge[i].next=-1;
head[i]=-1;
}
return;
}
void add_Node(int u,int v){
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=++cnt;
return;
}
void dfs(int x,int dad){
deep[x]=deep[dad]+1;
old[x][0]=dad;
for(int i=1;pow(2,i)<=deep[x];i++){
old[x][i]=old[old[x][i-1]][i-1];
}
for(int i=head[x];i!=-1;i=edge[i].next){
if(edge[i].to!=dad){
dfs(edge[i].to,x);
}
}
return;
}
int get_LCA(int x,int y){
if(deep[x]<deep[y]) swap(x,y);
for(int i=DEP;i>=0;i--){
if(deep[x]-pow(2,i)>=deep[y]){
x=old[x][i];
}
}
if(x==y) return y;
for(int i=DEP;i>=0;i--){
if(old[x][i]!=old[y][i]){
x=old[x][i];
y=old[y][i];
}
}
return old[x][0];
}
int main(){
in();
scanf("%d %d %d\n",&n,&m,&root);
for(int i=1;i<n;i++){
scanf("%d %d\n",&a,&b);
add_Node(a,b);
add_Node(b,a);
}
dfs(root,0);
for(int i=1;i<=m;i++){
scanf("%d %d\n",&a,&b);
printf("%d\n",get_LCA(a,b));
}
return 0;
}