#include <bits/stdc++.h>
#include <cstring>
#define INF 0x7f7f7f7f
#define eps 1e-6
#define ll long long
#define ull unsigned long long
#define N 500010
#define _rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define rint register int
using namespace std;
int n,m,s;
struct Edge{
int to,next;
}edge[N << 2];
int nbs[N],cnt;
int dep[N],fa[N][22];
int lg[N];
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;
}
inline void add(int u,int v)
{
edge[++cnt].to = v;
edge[cnt].next = nbs[u];
nbs[u] = cnt;
}
inline void dfs(int now,int fath)
{
fa[now][0] = fath;
dep[now] = dep[fath] + 1;
for(int i=1;i<=lg[dep[now]];i++)
{
fa[now][i] = fa[fa[now][i - 1]][i - 1];
}
for(int i=nbs[now];i;i=edge[i].next)
{
int to = edge[i].to;
if(to != fath) dfs(to,now);
}
}
inline int lca(int x,int y)
{
// if(x == s || y == s) return s;
if(dep[x] < dep[y]) swap(x,y);
while(dep[x] > dep[y])
{
x = fa[x][lg[dep[x] - dep[y]] - 1];
}
if(x == y) return x;
for(int i=lg[dep[x]] - 1;i;i--)
{
if(fa[x][i] != fa[y][i])
{
x = fa[x][i],y = fa[y][i];
}
}
return fa[x][0];
}
int main()
{
// std::ios::sync_with_stdio(false);
n = read(),m = read(),s = read();
for(int i=1;i<n;i++)
{
int u = read(),v = read();
add(u,v); add(v,u);
}
for(int i=1;i<=n;i++)
{
lg[i] = lg[i-1] + (1 << lg[i-1] == i);
}
dfs(s,0);
while(m--)
{
int u = read(),v = read();
printf("%d\n",lca(u,v));
}
return 0;
}