#include <iostream>
#include <vector>
using namespace std;
const int SIZE=5e5+10;
int n,m,s;
struct edg{
int u,v;
edg(int u=0,int v=0):u(u),v(v){}
}edge[2*SIZE];
vector<int> edgc[SIZE];
int siz[SIZE],dep[SIZE],fh[SIZE];
int wson[SIZE],dfn[SIZE],nfd[SIZE],toch[SIZE],dft;
void dfs(int u,int fa){
siz[u]=1,dep[u]=dep[fa]+1,fh[u]=fa;
for(int it:edgc[u]){
int v=edge[it].v;
if(v==fa) continue;
dfs(v,u);
siz[v]+=siz[u];
if(siz[wson[u]]<siz[v]) wson[u]=v;
}
}
void subd(int u,int top){
dfn[u]=++dft,nfd[dft]=u,toch[u]=top;
if(wson[u]==0) return;
subd(wson[u],top);
for(int it:edgc[u]){
int v=edge[it].v;
if(v==fh[u]||v==wson[u]) continue;
subd(v,v);
}
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
edge[i]=edg(x,y);
edgc[x].push_back(i);
edge[i+n]=edg(y,x);
edgc[y].push_back(i+n);
}
dfs(s,s),subd(s,s);
while(m--){
int u,v;
cin>>u>>v;
while(toch[u]!=toch[v]){
if(dep[toch[u]]<dep[toch[v]]) swap(u,v);
u=fh[toch[u]];
}
if(dep[u]>dep[v]) swap(u,v);
cout<<u<<endl;
}
return 0;
}