#include<bits/stdc++.h>
# define int long long
using namespace std;
const int maxn=5e5+10;
int n,m,t,tot;
int deep[maxn],p[maxn][22];
struct node{
int nxt,to;
}e[maxn*2];
int head[maxn];
void add(int u,int v){
e[++tot].nxt=head[u];
e[tot].to=v;
head[u]=tot;
}
void dfs(int u){
for(int i=head[u];~i;i=e[i].nxt){
int v=e[i].to;
if(!deep[v]){
deep[v]=deep[u]+1;
p[v][0]=u;
dfs(v);
}
}
}
void init(){
for(int j=1;(1<<j)<=n;j++){
for(int i=1;i<=n;i++){
p[i][j]=p[p[i][j-1]][j-1];
}
}
}
int lca(int x,int y){
if(deep[x]<deep[y]){
swap(x,y);
}
int z;
for(z=0;(1<<z)<=deep[x];z++);
z--;
for(int i=z;i>=0;i--){
if(deep[x]-(1<<i)>=deep[y]){
x=p[x][i];
}
}
if(x==y){
return x;
}
for(int i=z;i>=0;i--){
if(p[x][i]!=-1&&p[x][i]!=p[y][i]){
x=p[x][i];
y=p[y][i];
}
}
return p[x][0];
}
signed main(){
memset(head,-1,sizeof(head));
cin>>n>>m>>t;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
add(u,v);
add(v,u);
}
dfs(t);
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
cout<<lca(x,y)<<endl;
}
return 0;
}