#include<bits/stdc++.h>
using namespace std;
int n,m,s,u,v,c,head[510000],deep[510000],f[510000][21],x,y;
struct xzh
{
int next,to;
}edge[510000];
void add(int u,int v)
{
c++;
edge[c].next=head[u];
edge[c].to=v;
head[u]=c;
}
void dfs(int now,int fa)
{
for(int i=head[now];i;i=edge[i].next)
{
if(edge[i].to!=fa)
{
deep[edge[i].to]=deep[now]+1;
f[edge[i].to][0]=now;
dfs(edge[i].to,now);
}
}
}
void pre()
{
for(int i=1;i<=21;i++)
for(int j=1;j<=n;j++)
f[j][i]=f[f[j][i-1]][i-1];
}
int LCA(int x,int y)
{
if(deep[x]<deep[y])swap(x,y);
for(int i=21;i>=0;i--)if(deep[f[x][i]]>=deep[y])x=f[x][i];
if(x==y)return x;
for(int i=21;i>=0;i--)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
deep[s]=1;
dfs(s,0);
pre();
while(m--)
{
scanf("%d%d",&x,&y);
printf("%d\n",LCA(x,y));
}
return 0;
}