#include<iostream>
#include<cstdio>
#include<cstring>
#define MS(x) memset(x,0,sizeof x)
using namespace std;
const int MAX=500005;
int F[19][MAX];
int head[MAX],nxt[MAX*2],ver[MAX*2],dep[MAX];
int tot=0;
int n,m,s;
int addedge(int x1,int x2)
{
ver[++tot]=x2;
nxt[tot]=head[x1];
head[x1]=tot;
ver[++tot]=x1;
nxt[tot]=head[x2];
head[x2]=tot;
}
void dfs(int x)
{
for(int i=head[x];i;i=nxt[i])
{
if(ver[i]==F[0][x]) continue;
F[0][ver[i]]=x;
dep[i]=dep[x]+1;
dfs(ver[i]);
}
}
void build()
{
for(int i=1;i<19;++i)
{
for(int j=1;j<=n;++j)
{
F[i][j]=F[i-1][F[i-1][j]];
}
}
}
int query(int a,int b)
{
if(dep[a]<dep[b])
swap(a,b);
int temp=dep[a]-dep[b];
for(int i=18;i>=0;--i)
{
if(temp>=(1<<i))
{
temp-=1<<i;
a=F[i][a];
}
}
for(int i=18;i>=0;--i)
{
if(F[i][a]!=F[i][b])
{
a=F[i][a];
b=F[i][b];
}
}
return F[0][a];
}
int main()
{
MS(head);
MS(nxt);
MS(ver);
memset(F,0,sizeof F);
cin>>n>>m>>s;
int x,y;
for(int i=1;i<n;++i)
{
scanf("%d%d",&x,&y);
addedge(x,y);
}
dep[s]=1;
F[0][s]=s;
dfs(s);
build();
int a,b;
for(int i=0;i<m;++i)
{
scanf("%d%d",&a,&b);
printf("%d\n",query(a,b));
}
return 0;
}