#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int MAXN=5e5+5;
const int MAX_LOG=19;
int f[MAXN][MAX_LOG+1];
int dep[MAXN];
int head[MAXN],nxt[MAXN],e[MAXN];
int cnt;
void add(int a,int b)
{
e[cnt]=b;
nxt[cnt]=head[a];
head[a]=cnt;
++cnt;
}
void dfs(int u,int fa);
inline int go(int x,int d);
int LCA(int a,int b)
{
if (dep[a]<dep[b]) swap(a,b);
a=go(a,dep[a]-dep[b]);
if (a==b) return a;
for (int i=MAX_LOG;i>=0;--i)
if (f[a][i]!=f[b][i]) a=f[a][i],b=f[b][i];
return f[a][0];
}
#include <cstring>
int main()
{
memset(head,-1,sizeof head);
int n,m,s;
cin>>n>>m>>s;
for (int i=1;i<n;++i)
{
int a,b;
scanf("%d %d",&a,&b);
add(a,b);
add(b,a);
}
dfs(s,0);
for (int i=1;i<=MAX_LOG;++i)
for (int a=1;a<=n;++a)
f[a][i]=f[f[a][i-1]][i-1];
while (m--)
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d\n",LCA(a,b));
}
return 0;
}
void dfs(int u,int fa)
{
f[u][0]=fa;
dep[u]=dep[fa]+1;
for (int i=head[u];i!=-1;i=nxt[i])
{
int v=e[i];
if (v==fa) continue;
dfs(v,u);
}
}
int go(int x,int d)
{
for (int i=0;d;++i)
{
if (d&1) x=f[x][i];
d>>=1;
}
return x;
}