#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int order=0;
int n,m,s,dfn[2*N],pos[N],vis[N];
int cnt,head[N],nxt[N],to[N];
int st[21][2*N],ll[2*N]{0,0,1};
void add_edge(int u,int v){
nxt[++cnt]=head[u];
head[u]=cnt,to[cnt]=v;
}
void dfs(int now){
dfn[++order]=now;
pos[now]=order;
vis[now]=true;
for(int i=head[now];i;i=nxt[i])
if(!pos[to[i]]){
dfs(to[i]);
dfn[++order]=now;
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(nullptr);
cin>>n>>m>>s;
for(int i=1,u,v;i<=n-1;i++){
cin>>u>>v,add_edge(u,v),add_edge(v,u);
}
dfs(s);
for(int i=1;i<=n;i++)
if(!vis[i]){
cout<<9<<endl;
break;
}
for(int i=1;i<=2*n-1;i++){
st[0][i]=pos[dfn[i]];
}
for(int i=3;i<2*N;i++)
ll[i]=ll[i/2]+1;
for(int i=1;i<=20;i++)
for(int j=1;j<=2*n-1;j++)
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<(i-1))]);
for(int a,b;m--;){
cin>>a>>b;
int l=min(pos[a],pos[b]),r=max(pos[a],pos[b]);
int s=ll[r-l+1];
cout<<dfn[min(st[s][l],st[s][r-(1<<s)+1])]<<'\n';
}
return 0;
}
大样例会输出0,似乎是有哪些点没有访问到,,不知道是不是dfs有问题..