#include <cstdio>
#include <algorithm>
using namespace std;
struct node
{
int t;
int nxt;
};
node e[10000005];
int head[10000005];
int top;
inline void add(int x,int y)
{
top++;
e[top].t=y;
e[top].nxt=head[x];
head[x]=top;
}
int dep[1000005],lg[1000005];
int f[100005][25];
inline void dfs(int now,int fa)
{
f[now][0]=fa;
dep[now]=dep[fa]+1;
for(register int i=1;i<=lg[dep[now]];i++)
{
f[now][i]=f[f[now][i-1]][i-1];
}
for(register int i=head[now];i;i=e[i].nxt)
{
if(e[i].t!=fa)
{
dfs(e[i].t,now);
}
}
}
inline int LCA(int x,int y)
{
if(dep[x]<dep[y])
{
swap(x,y);
}
while(dep[x]>dep[y])
{
x=f[x][lg[dep[x]-dep[y]]-1];
}
if(x==y)
{
return x;
}
for(register int k=lg[dep[x]]-1;k>=0;k--)
{
if(f[x][k]!=f[y][k])
{
x=f[x][k];
y=f[y][k];
}
}
return f[x][0];
}
int main()
{
int n,m,s;
scanf("%d%d%d",&n,&m,&s);
for(register int i=1;i<=n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(register int i=1;i<=n;i++)
{
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
}
dfs(s,0);
for(register int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",LCA(x,y));
}
return 0;
}