//求最近公共祖先
#include<bits/stdc++.h>
using namespace std;
const long long maxn = 5e5+10;
struct node
{
long long to,next;
} edge[maxn*2];
long long cnt,deep[maxn],fa[maxn][50],head[maxn],lg[maxn];
void add(long long u, long long v)
{
edge[cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt++;
}
void dfs(long long x,long long fath)//求出每个点的deep和,fa[i][j]
{
fa[x][0] = fath;
deep[x] = deep[fath]+1;
for(long long i = 1; i<=lg[deep[x]]; i++)
{
fa[x][i] = fa[fa[x][i-1]][i-1];
}
for(long long i = head[x]; i>=0; i = edge[i].next)
{
long long to = edge[i].to;
if(to != fath)
dfs(to,x);
}
}
void init_lg(int n)
{
for(long long i = 1; i<=n; i++)
{
lg[i] = lg[i-1]+(1<<lg[i-1]==i);
}
}
long long lca(long long x, long long y)
{
if(deep[x]<deep[y])
swap(x,y);
while(deep[x]>deep[y])//将x,y调到同一层
{
x = fa[x][lg[deep[x]-deep[y]]-1];
}
if(x==y)
return x;
for(long long i = lg[deep[x]]; i>=0; i--)
{
if(fa[x][i]!=fa[y][i])
{
x = fa[x][i];
y = fa[y][i];
}
}
return fa[x][0];
}
int main()
{
long long i,j,m,n,s,a,b;
scanf("%lld %lld %lld",&n, &m,&s);//点的个数,询问的次数,根节点
init_lg(n);
cnt = 0;
memset(head,-1,sizeof(head));
for(i = 0; i < n-1; i++)
{
scanf("%lld %lld",&a, &b);
add(a,b);
add(b,a);
}
dfs(s,0);
for(i = 0; i < m; i++)
{
scanf("%lld %lld",&a,&b);
printf("%lld\n",lca(a,b));
}
for(i = 0;i < n;i++)
return 0;
}