#include<iostream>
#include<cstring>
using namespace std;
const int N=500010;
int read(){
int x=0,t=1;
char a=getchar();
while(a>'9'||a<'0'){if(a=='-')t=-1;a=getchar();}
while(a>='0'&&a<='9'){x=x*10+a-'0';a=getchar();}
return x*t;
}
struct node{
int wei,nex;
}bian[N<<1];
int head[N];
int n,m,s;
int x,y;
int bs=1;
int lg[N];
int fa[N][22]; //2的20次方是10
int sd[N];
void lian(int a,int b){//邻接表
bian[bs].nex=head[a];
head[a]=bs;
bian[bs].wei=b;
bs++;
}
int faf(int now,int fath){
//cout<<"giao"<<now<<" "<<fath<<endl;
fa[now][0]=fath;
sd[now]=sd[fath]+1;
for(int i=1;i<=lg[sd[now]];i++){
fa[now][i]=fa[fa[now][i-1]][i-1];//2^i=(2^(i-1))*(2^(i-1))
}
for(int i=head[now];i;i=bian[i].nex){
if(bian[i].wei!=fath){
faf(bian[i].wei,now);
}
}
}
int LCA(int x,int y){
if(sd[x]<sd[y]){
swap(x,y);
}
while(sd[x]>sd[y]){
x=fa[x][lg[sd[x]-sd[y]]-1];
}
if(x==y){
return x;
}
for(int i=lg[sd[x]]-1;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i],y=fa[y][i];
}
}
return fa[x][0];
}
int main(){
n=read();
m=read();
s=read();
for(int i=1;i<=n-1;i++){
x=read();
y=read();
lian(x,y);
lian(y,x);
}
for(int i=1;i<=n;i++){
lg[i]=lg[i/2]+1;//第一个比i这个数大的2的次方
}
faf(s,0);
for(int i=1;i<=m;i++){
x=read();
y=read();
printf("%d\n",LCA(x,y));
}
return 0;
}