RT
#include<bits/stdc++.h>
using namespace std;
#define ll int
ll tot,f[100001],p[100001],n,m,s;
struct bb {
ll deep,fa,son[101],tot,v,mx,top;
}tree[100001];
void dfs1(ll x,ll f,ll d) {
tree[x].fa=f;
tree[x].deep=d;
for(ll i=1;i<=tree[x].tot;i++) {
ll t=tree[x].son[i];
if(t!=f) {
dfs1(t,x,d+1);
tree[x].v+=tree[t].v;
if(tree[t].v>tree[tree[x].mx].v) tree[x].mx=t;
}
}
}
void dfs2(ll x,ll t) {
f[x]=++tot;
tree[x].top=t;
p[tot]=x;
if(tree[x].tot==0) return;
dfs2(tree[x].mx,t);
for(ll i=1;i<=tree[x].tot;i++) {
ll r=tree[x].son[i];
if(r!=tree[x].fa&&r!=tree[x].mx) {
dfs2(r,r);
}
}
}
int main() {
scanf("%d%d%d" ,&n ,&m ,&s);
for(ll i=1;i<n;i++) {
ll x,y;
scanf("%d%d" ,&x ,&y);
ll u=++tree[x].tot;
tree[x].son[u]=y;
u=++tree[y].tot;
tree[y].son[u]=x;
}
dfs1(s,0,1);
dfs2(s,s);
for(ll i=1;i<=m;i++) {
ll x,y;
scanf("%d%d" ,&x ,&y);
while(tree[x].top!=tree[y].top) {
if(tree[x].deep>=tree[y].deep) x=f[tree[x].top];
else y=f[tree[y].top];
}
printf("%d\n" ,tree[x].deep<tree[y].deep?x:y);
}
return 0;
}