#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
const int N = 5e5+5;
struct node{
int deep;
int num;
}minn[N][20];
node min_deep(node a,node b){
if(a.deep < b.deep){
return a;
}
else{
return b;
}
}
vector<int> a[N];
vector<node> b;
int d[N],c[N],cnt = 0;
void deep(int now,int fa){
d[now] = d[fa] + 1;
for(int i=0;i<a[now].size();i++){
if(a[now][i] != fa){
deep(a[now][i],now);
}
}
}
void dfs(int now,int fa){
cnt ++;
c[now] = cnt;
b.push_back({d[now],now});
for(int i=0;i<a[now].size();i++){
if(a[now][i] != fa){
dfs(a[now][i],now);
}
}
}
int query(int l,int r){
int k = log2(r-l+1);
return min_deep(minn[l][k],minn[r-(1<<k)+1][k]).num;
}
int main(){
int n,m,s,x,y;
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n-1;i++){
scanf("%d%d",&x,&y);
a[x].push_back(y);
a[y].push_back(x);
}
deep(s,0);
dfs(s,0);
for(int i=1;i<=n;i++){
minn[i][0] = b[i];
}
for(int j=1;j<=18;j++){
for(int i=1;i+(1<<j)-1 <= n;i++){
minn[i][j] = min_deep(minn[i][j-1],minn[i+(1<<(j-1))][j-1]);
}
}
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y));
}
}