#include <bits/stdc++.h>
using namespace std;
#define N 500001
int n,m,s;
struct list{
int to[N],nxt[N],head[N],tot;
void add(int a,int b){
to[++tot]=b;
nxt[tot]=head[a];
head[a]=tot;
}
}G;
int cnt=0,pos[N],dep[N],seq[N],vis[N];
void dfs(int u,int d){
seq[++cnt]=u;
pos[u]=cnt;
dep[cnt]=d;
vis[u]=1;
for(int i=G.head[u];i;i=G.nxt[i]){
int v=G.to[i];
if(vis[v]) continue;
dfs(v,d+1);
seq[++cnt]=u;
dep[cnt]=d;
}
}
int lg[N];
void log_find(){
lg[0]=-1;
for(int i=1;i<=cnt;i++){
lg[i]=(i&(i-1))?lg[i-1]:lg[i-1]+1;
}
}
int f[20][N];
void ST_create(){
for(int i=1;i<=cnt;i++){
f[0][i]=i;
}
int k=lg[cnt];
for(int j=1;j<=k;j++){
for(int i=1;i<=cnt-(1<<j)+1;i++){
f[j][i]=(dep[f[j-1][i]])<dep[f[j-1][i+(1<<(j-1))]]?f[j-1][i]:f[j-1][i+(1<<(j-1))];
}
}
}
int RMQ_query(int l,int r){
int k=lg[r-l+1];
return (dep[f[k][l]]<dep[f[k][r-(1<<k)+1]])?f[k][l]:f[k][r-(1<<k)+1];
}
int LCA(int u,int v){
int l=pos[u],r=pos[v];
if(l>r) swap(l,r);
return seq[RMQ_query(l,r)];
}
int main(){
cin>>n>>m>>s;
for(int i=1,u,v;i<n;i++){
cin>>u>>v;
G.add(u,v);
G.add(v,u);
}
dfs(s,1);
ST_create();
for(int i=1,u,v;i<=m;i++){
cin>>u>>v;
cout<<LCA(u,v)<<endl;
}
return 0;
}