#include<bits/stdc++.h>
#define time tim
using namespace std;
const int N=3e6+10;
int mi[N][20];
int md[N][20];
int lg[N];
struct M{
int ne;
int v;
}e[N];
int ndfn[N];
int faaa[N];
struct node{
int deep;
int dfn;
int fa;
}no[N];
int n,m,s;
int tot=0;
int head[N];
void add(int u,int v){
e[++tot].v=v;
e[tot].ne=head[u];
head[u]=tot;
}
int time=0;
int deep=0;
void dfs(int k,int fa){
time++;
deep++;
if(!no[k].dfn){
ndfn[k]=time;
no[k].dfn=time;
no[k].deep=deep;
}
for(int i=head[k];i;i=e[i].ne){
if(e[i].v!=fa){
no[e[i].v].fa=k;
dfs(e[i].v,k);
}
}
deep--;
return;
}
int ask(int x,int y){
int minn=214748364;
int c=0;
x=ndfn[x];
y=ndfn[y];
if(x>y){
swap(x,y);
}
//x++;
int d=lg[y-x+1];
c=min(mi[x][d],mi[y-(1<<(d))+1][d]);
if(c==mi[x][d]){
c=md[x][d];
}
else{
c=md[y-(1<<(d))+1][d];
}
return c;
}
bool cmp(node a,node b){
return a.dfn<b.dfn;
}
int main(){
scanf("%d%d%d",&n,&m,&s);
int u,v;
for(int i=1;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
lg[1]=0;
no[s].fa=s;
for(int i=2;i<=n;i++){
lg[i]=lg[i>>1]+1;
}
dfs(s,s);
memset(mi,0x3f,sizeof(mi));
sort(no+1,no+n+1,cmp);
for(int i=1;i<=n;i++){
mi[i][0]=no[i].deep;
md[i][0]=no[i].fa;
}
int x=0,y=0;
for(int j=1;j<=lg[n];j++){
for(int i=1;i<=n-(1ll<<(j))+1;i++){
mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);
if(mi[i+(1<<(j-1))][j-1]>mi[i][j-1]){
md[i][j]=md[i][j-1];
}
else{
md[i][j]=md[i+(1<<(j-1))][j-1];
}
}
}
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
if(x==y){
printf("%d\n",x);
}
else printf("%d\n",ask(x,y));
}
return 0;
}