#include<bits/stdc++.h>
using namespace std;
int n,m,s;
struct p{
int cnt=0;
map <int,int> l;
}qwq[500004];
int bz[500004][21];
bool vst[500004];
int fa[500004],sd[500004];
void dfs(int k,int d){
sd[k]=d;
vst[k]=1;//标记访问
if(d!=1){
int w=1,awa=fa[k];
for(int i=0;w<=d;i++){//倍增初始化
w=w<<1;
bz[k][i]=awa;//cout<<"???"<<ksm(2,i)<<endl;
awa=bz[awa][i];
}
}
for(int i=1;i<=qwq[k].cnt;i++){//遍历该点所有边
if(!vst[qwq[k].l[i]]){//没访问过,向下走
fa[qwq[k].l[i]]=k; dfs(qwq[k].l[i],d+1);
}
}
return;
}
int lg(int a){
int tmp=0;
for(;a>1;a=a>>1){
tmp++;
}
return tmp;
}
void bez(int a,int b){
while(sd[a]<sd[b]){//cout<<sd[a]<<"<<<"<<sd[b]<<endl;
b=bz[b][lg(sd[b]-sd[a])];
}
//cout<<"!!!"<<a<<"!!!"<<b<<endl;
if(a==b){
printf("%d\n",a); return;
}
int f=0; bool awa=0;
while(a!=b){
while(bz[a][f]==bz[b][f]){//如果下次倍增到达同一节点
if(f) f=f>>1;//如果f不为0,倍增跨度缩小一点点
else {//如果为0,说明再向上一格就到了
printf("%d\n",bz[a][0]); return;
}
awa=1;
}
a=bz[a][f]; b=bz[b][f];//节点向上挪
if(!awa) f=f<<1;
}
return;
}
int main(){
scanf("%d%d%d",&n,&m,&s);
int a,b;
for(int i=1;i<=n-1;i++){
scanf("%d%d",&a,&b);
qwq[a].cnt++; qwq[a].l[qwq[a].cnt]=b;
qwq[b].cnt++; qwq[b].l[qwq[b].cnt]=a;
}//存双向边
dfs(s,1);//预处理深度
/*for(int i=1;i<=n;i++){
for(int j=0;j<=4;j++) cout<<bz[i][j]<<" ";
cout<<" sd["<<i<<"]="<<sd[i]<<endl;
}*/
int q;
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
if(a==b){
printf("%d\n",a);
continue;
}
if(sd[a]>sd[b]){//cout<<"??"<<endl;
bez(b,a);
}
else bez(a,b);
}
return 0;
}
RT QWQ