#include <bits/stdc++.h>
using namespace std;
const int N=500005;
int fa[N],head[N],cnt,head_query[N],cnt_query,ans[N];
bool vis[N];
struct Edge{
int v,next,num;
}edge[N*2],query[N*2];
void init(){
for(int i=0;i<2*N;++i){
edge[i].next=-1;head[i]=-1;
query[i].next=-1;head_query[i]=-1;
}
cnt=0;cnt_query=0;
}
void addedge(int u,int v){
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void add_query(int x,int y,int num){
query[cnt_query].v=y;
query[cnt_query].num=num;
query[cnt_query].next=head_query[x];
head_query[x]=cnt_query++;
}
int find_set(int x){
return fa[x]==x?x:find_set(fa[x]);
}
void tarjan(int x){
vis[x]=true;
for(int i=head[x];i!=-1;i=edge[i].next){
int y=edge[i].v;
if(!vis[y]){
tarjan(y);
fa[y]=x;
}
}
for(int i=head_query[x];i!=-1;i=query[i].next){
int y=query[i].v;
if(vis[y]) ans[query[i].num]=find_set(y);
}
}
int main(){
init();
memset(vis,0,sizeof(vis));
int n,m,root;
cin>>n>>m>>root;
for(int i=1;i<n;i++){
fa[i]=i;
int u,v;
cin>>u>>v;
addedge(u,v);
addedge(v,u);
}
fa[n]=n;
for(int i=1;i<=m;++i){
int a,b;
cin>>a>>b;
add_query(a,b,i);
add_query(b,a,i);
}
tarjan(root);
for(int i=1;i<=m;++i) cout<<ans[i]<<endl;
return 0;
}
求大佬