#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct zzz {
int t, nex;
}e[500010 << 1]; int head[500010], tot;
void add(int x, int y) {
e[++tot].t = y;
e[tot].nex = head[x];
head[x] = tot;
}
int depth[500001], fa[500001][22], lg[500001];
void dfs(int now, int fath) {
fa[now][0] = fath; depth[now] = depth[fath] + 1;
for(int i = 1; i <= lg[depth[now]]; ++i)
fa[now][i] = fa[fa[now][i-1]][i-1];
for(int i = head[now]; i; i = e[i].nex)
if(e[i].t != fath) dfs(e[i].t, now);
}
int LCA(int x, int y) {
if(depth[x] < depth[y]) swap(x, y);
while(depth[x] > depth[y])
x = fa[x][lg[depth[x]-depth[y]] - 1];
if(x == y) return x;
for(int k = lg[depth[x]] - 1; k >= 0; --k)
if(fa[x][k] != fa[y][k])
x = fa[x][k], y = fa[y][k];
return fa[x][0];
}
int main() {
int n, m, s; scanf("%d%d%d", &n, &m, &s);
for(int i = 1; i <= n-1; ++i) {
int x, y; scanf("%d%d", &x, &y);
add(x, y); add(y, x);
}
for(int i = 1; i <= n; ++i)
lg[i] = lg[i-1] + (1 << lg[i-1] == i);
dfs(s, 0);
for(int i = 1; i <= m; ++i) {
int x, y; scanf("%d%d",&x, &y);
printf("%d\n", LCA(x, y));
}
return 0;
}
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll most=500002;
ll n,m,num=0,f[most][20],head[most],deep[most];
struct eg
{
ll to,from;
}eg[most<<1];
void ad(ll x,ll y)
{
eg[++num].to=y;
eg[num].from=head[x];
head[x]=num;
}
void dfr(ll x)
{
for(ll i=1;i<=20;i++)
f[x][i]=f[f[x][i-1]][i-1];
for(ll i=head[x];i;i=eg[i].from)
{
ll v=eg[i].to;
if(v!=f[x][0])
{
deep[v]+=deep[x]+1;
f[v][0]=x;
dfr(v);
}
}
}
ll lca(ll x,ll y)
{
if(deep[x]<deep[y])
swap(x,y);
for(ll i=20;i>=0;i--)
if(deep[f[x][i]]>=deep[y])
x=f[x][i];
if(x==y)
return x;
else
for(ll i=20;i>=0;i--)
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
return f[x][0];
}
int main()
{
ll n,m,c,x,y;
cin>>n>>m>>c;
for(ll i=1;i<n;i++)
{
scanf("%ld%ld",&x,&y);
ad(x,y);
ad(y,x);
}
deep[c]=1;
dfr(c);
for(ll i=1;i<=m;i++)
{
scanf("%ld%ld",&x,&y);
cout<<lca(x,y)<<endl;
}
return 0;
}