#include<bits/stdc++.h>
using namespace std;
int n,m,s;
const int N=1500001;
int read(){
int x=0;char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c)){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x;
}
struct edge{
int nxt,to;
}edge[N];
int cnt,head[N];
void add(int x,int y){
edge[++cnt].to=y;
edge[cnt].nxt=head[x];
head[x]=cnt;
}
int fa[N][35],d[N],lg[N];
void dfs(int now,int fath){
for(int i = 1; i <= n; ++i)
lg[i]=lg[i-1] + (1<<lg[i-1]==i);
fa[now][0]=fath;d[now]=d[fath]+1;
for(int i=1; i<=lg[d[now]]; ++i)
fa[now][i] = fa[fa[now][i-1]][i-1];
for(int i=head[now];i;i=edge[i].nxt)
if(edge[i].to!=fath)dfs(edge[i].to,now);
}
int LCA(int x,int y){
if(d[x] < d[y]) swap(x, y);
while(d[x] > d[y])
x = fa[x][lg[d[x]-d[y]]-1];
if(x == y) return x;
for(int k=lg[d[x]]-1;k>=0;--k)
if(fa[x][k]!=fa[y][k])
x=fa[x][k],y=fa[y][k];
return fa[x][0];
}
int main(){
cin>>n>>m>>s;
int x,y;
for(int i=1;i<=n-1;++i){
x=read();y=read();
add(x,y);add(y,x);
}
dfs(s,0);
for(int i=1;i<=m;i++){
x=read();y=read();
int k=LCA(x,y);
printf("%d\n",k);
}
return 0;
}