#include<bits/stdc++.h>
#define maxn 500005
#define INF 0x3f3f3f3f
#define ll long long
int n,m,s;
int head[maxn];
struct Edge{
int to;
int next;
}edge[maxn<<1];
int tot=0;
int size[maxn]={0},d[maxn]={0},son[maxn]={0},f[maxn]={0},top[maxn]={0};
void addedge(int u,int v)
{
edge[++tot].to=v;
edge[tot].next=head[u];
head[u]=tot;
}
void dfs1(int x,int fa)
{
size[x]=1;
d[x]=d[fa]+1;
son[x]=0;
f[x]=fa;
for(int i=head[x];~i;i=edge[i].next){
int to=edge[i].to;
if(to==fa)continue;
dfs1(to,x);
size[x]+=size[to];
if(size[son[x]]<size[to]) son[x]=to;
}
}
void dfs2(int x,int topx)
{
top[x]=topx;
if(son[x]!=0)dfs2(son[x],topx);
for(int i=head[x];~i;i=edge[i].next)
if(edge[i].to!=son[x]&&edge[i].to!=f[x])
dfs2(edge[i].to,edge[i].to);
}
void lca(int u,int v)
{
while(top[u]!=top[v])
{
if(d[u]>=d[v])u=f[top[u]];
else v=f[top[v]];
}
printf("%d\n",d[u]<d[v]?u:v);
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=0;i<=n;i++)
head[i]=-1;
for(int i=1;i<=n-1;i++)
{
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
dfs1(s,s);
dfs2(s,s);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
lca(u,v);
}
}