#include<bits/stdc++.h>
using namespace std;
const int MAXM=500005;
inline void read(int &num)
{
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9')
{
num=(num<<1)+(num<<3)+(ch-'0');
ch=getchar();
}
return;
}
int n,m,s,cnt;
struct EDGE{
int from,to,pre;
}edge[MAXM<<1];
int u,v,head[MAXM];
void add(int from,int to)
{
edge[++cnt].from=from;
edge[cnt].to=to;
edge[cnt].pre=head[from];
head[from]=cnt;
return;
}
int lca[MAXM][25],dep[MAXM];
void dfs(int u,int fa)
{
dep[u]=dep[fa]+1;
lca[u][0]=fa;
for(int i=1;(1<<i)<=dep[u];i++)
lca[u][i]=lca[lca[u][i-1]][i-1];
for(int i=head[u];i;i=edge[i].pre)
if(edge[i].to!=fa)
dfs(edge[i].to,u);
return;
}
int getlca(int a,int b)
{
if(dep[a]>dep[b]) swap(a,b);
for(int i=23;i>=0;i--)
if(dep[b]-(1<<i)>=dep[a])
b=lca[b][i];
if(a==b) return a;
for(int i=23;i>=0;i--)
{
if(lca[a][i]!=lca[b][i]&&lca[a][i]!=0)
{
a=lca[a][i];
b=lca[b][i];
}
}
return lca[b][0];
}
int main(){
read(n),read(m),read(s);
for(int i=1;i<n;i++)
{
read(u),read(v);
add(u,v);
add(v,u);
}
dfs(s,s);
for(int i=1;i<=m;i++)
{
read(u),read(v);
printf("%d\n",getlca(u,v));
}
return 0;
}