#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
const int N = 5e5+10;
int n,m,rt;
int dfn[N],siz[N],top[N],hs[N],cnt,fa[N],dep[N];
int head[N],ne[N*2],ver[N*2],tot;
void add(int x,int y)
{
ver[++tot]=y;
ne[tot]=head[x];
head[x]=tot;
}
void dfs1(int x,int f)
{
dep[x]=dep[f]+1;
fa[x]=f;
siz[x]=1;
int maxn=-1;
for(int i=head[x];i;i=ne[i])
{
int y=ver[i];
if(y==f) continue;
dfs1(y,x);
if(siz[y]>maxn) hs[x]=y,maxn=siz[y];
}
}
void dfs2(int x,int t)
{
dfn[x]=++cnt;
top[x]=t;
if(hs[x]) dfs2(hs[x],t);
else return ;
for(int i=head[x];i;i=ne[i])
{
int y=ver[i];
if(y==hs[x]||y==fa[x]) continue;
dfs2(y,y);
}
}
int getlca(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(dep[x]<dep[y]) return x;
return y;
}
int main()
{
n=read(),m=read(),rt=read();
for(int i=1;i<n;i++)
{
int x=read(),y=read();
add(x,y);
add(y,x);
}
dfs1(rt,0);
dfs2(rt,rt);
while(m--)
{
int x=read(),y=read();
printf("%d\n",getlca(x,y));
}
return 0;
}