#include<bits/stdc++.h>
using namespace std;
struct tree {
int to,next;
} es[1500000];
int head[1514514]= {-1},fa[1514514][15],deep[1514514],n,m,s;
int num=1;
void insert(int u,int v) {
es[num].to=v;
es[num].next=head[u];
head[u]=num++;
}
void dfs(int x,int fath) {
fa[x][0]=fath;
deep[x]=deep[fath]+1;
for(int i=1; i<=14; i++) {
fa[x][i]=fa[fa[x][i-1]][i-1];
}
for(int i=head[x]; i; i=es[i].next) {
if(es[i].to!=fath) {
dfs(es[i].to,x);
}
}
}
int lca(int x,int y) {
if(deep[x]<deep[y])swap(x,y);
for(int i=14; i+1; i--) {
if(deep[fa[x][i]]>=deep[y])x=fa[x][i];
}
if(x==y)return x;
for(int i=14; i+1; i--) {
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
int main() {
scanf("%d%d%d",&n,&m,&s);
// memset(head,-1,sizeof(head));
for(int i=1; i<n; i++) {
int u,v;
scanf("%d%d",&u,&v);
insert(u,v);
insert(v,u);
}
dfs(s,0);
for(int i=1; i<=m; i++) {
int u,v;
cin>>u>>v;
printf("%d\n",lca(u,v));
}
return 0;
}
没T但subtask全WA