#include<bits/stdc++.h>
#define Max 500005
using namespace std;
int N,M,R;
int h[Max],to[Max<<1],nex[Max<<1],did;
int o[Max<<1],dep[Max<<1],cnt,first[Max];
struct node{
int val,id;
}f[Max<<1][20],g[Max<<1][20];
int Log[Max];
void edge(int a,int b){
to[++did]=b;
nex[did]=h[a];
h[a]=did;
}
void dfs(int u,int fa,int de){
o[++cnt]=u;
dep[cnt]=de;
if(first[u]==0)first[u]=cnt;
for(int i=h[u];i;i=nex[i]){
int v=to[i];
if(v==fa)continue;
dfs(v,u,de+1);
o[++cnt]=u;
dep[cnt]=de;
}
}
int LCA(int a,int b){
int x=first[a],y=first[b];
if(x>y)swap(x,y);
if(f[a][Log[y-x+1]].val<g[b][Log[y-x+1]].val)
return o[f[a][Log[y-x+1]].id];
else return o[g[b][Log[y-x+1]].id];
}
int main(){
scanf("%d%d%d",&N,&M,&R);
for(int i=1;i<N;i++){
int a,b;
scanf("%d%d",&a,&b);
edge(a,b);
edge(b,a);
}
dfs(R,0,1);
for(int i=1;i<=cnt;i++)f[i][0].val=g[i][0].val=dep[i],f[i][0].id=g[i][0].id=i;
for(int i=cnt-1;i>=1;--i){
for(int j=1;(1<<j)+i<=cnt;j++){
if(f[i][j-1].val<f[i+(1<<j)][j-1].val){
f[i][j]=f[i][j-1];
}
else f[i][j]=f[i+(1<<j)][j-1];
}
}
for(int i=2;i<=cnt;i++){
for(int j=1;(1<<j)<=i;j++){
if(g[i][j-1].val<g[i-(1<<j-1)][j-1].val)
g[i][j]=g[i][j-1];
else g[i][j]=g[i-(1<<j-1)][j-1];
}
}
Log[1]=0;
for(int i=2;i<=N;i++)Log[i]=Log[i/2]+1;
while(M--){
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",LCA(a,b));
}
return 0;
}