#include<cmath>
#include<stack>
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
struct TREE
{
int pre;
int to;
}tree[500010];
int edge_sum,head[500010];
int N,M,S,parent[30][500010],depth[500010];
void add_edge(int from,int to)
{
edge_sum++;
tree[edge_sum].pre=head[from];
tree[edge_sum].to=to;
head[from]=edge_sum;
}
void dfs(int dep,int cur,int fa)
{
depth[cur]=dep;
parent[0][cur]=fa;
for(int i=head[cur];i!=0;i=tree[i].pre)
{
int u=tree[i].to;
if(u!=fa)dfs(dep+1,u,cur);
}
}
int query_LCA(int u,int v)
{
if(depth[u]<depth[v])swap(u,v);
if(depth[u]!=depth[v])
for(int k=log(N)/log(2);k>=0;k--)
if(depth[u]+(1<<k)<=depth[v])u=parent[k][u];
if(u==v)return u;
for(int k=log(N)/log(2);k>=0;k--)
if(parent[k][u]!=parent[k][v])
u=parent[k][u],v=parent[k][v];
return parent[0][u];
}
int main()
{
cin>>N>>M>>S;
for(int i=1;i<=N-1;i++)
{
int u,v;
cin>>u>>v;
add_edge(u,v);
add_edge(v,u);
}
dfs(1,S,S);
for(int k=1;k<=log(N)/log(2);k++)
for(int v=1;v<=N;v++)
parent[k][v]=parent[k-1][parent[k-1][v]];
for(int i=1;i<=M;i++)
{
int u,v;
cin>>u>>v;
cout<<query_LCA(u,v)<<endl;
}
return 0;
}
倍增的 20分