#include<bits/stdc++.h>
using namespace std;
map<int,map<int,bool> >a;
vector<int> chd[50000];
vector<int> ola;
int pa[50000];
int fi[50000];
int deep[50000];
int dfs(int p){
ola.push_back(p);
for(vector<int>::const_iterator it = chd[p].begin(); it != chd[p].end(); it++){
dfs(*it);
ola.push_back(p);
}
}
int mktree(int p,int dee){
deep[p]=dee;
vector<int> v;
for(map<int,bool>::iterator it = a[p].begin(); it != a[p].end(); it++){
if(it->second==1){
chd[p].push_back(it->first);
v.push_back(it->first);
pa[it->first]=p;
a[it->first][p]=0;
}
}
for(vector<int>::const_iterator it = v.begin(); it != v.end(); it++){
mktree(*it,dee+1);
}
}
int find(int x,int y){
if(fi[x]>fi[y])swap(x,y);
int pi=deep[x],lca=x;
for(int i=fi[x];i<=fi[y];i++){
if(deep[ola[i]]<pi){
pi=deep[ola[i]];
lca=ola[i];
}
}
return lca;
}
int main(){
int n,m,s;
cin>>n>>m>>s;
for(int i=0;i<=n;i++){
fi[i]=-1;
}
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
a[x][y]=1;
a[y][x]=1;
}
mktree(s,1);
dfs(s);
int l=1;
for(vector<int>::const_iterator it = ola.begin(); it != ola.end(); it++,l++){
if(fi[*it]==-1)fi[*it]=l;
}
while(m--){
int x,y;
cin>>x>>y;
cout<<find(x,y)<<endl;
}
}