#include <iostream>
#include <ratio>
#include<unordered_map>
#include <utility>
#include <vector>
using namespace std;
// 方法1:DFS递归计算深度
void calculateDepthDFS(int node,int father, int currentDepth, 
                      vector<vector<int>>& up,vector<int>& depth,vector<vector<int>>& adj) {
    // 记录当前节点的深度
    up[0][node] =father;
    //求直接父节点
    depth[node]=currentDepth;
    if (adj[node].empty()) return;
    // 递归处理所有子节点
    for (int child : adj[node]) {
        calculateDepthDFS(child,node, currentDepth + 1, up,depth,adj);
    }
}
void DoubleCreationtable(int n,vector<vector<int>>& up,vector<int>& depth){
    for(int p=1;p<=19;p++){
        for(int u=1;u<=n;u++){
            if((2^p)<=depth[u]){
                up[p][u]=up[p-1][up[p-1][u]];
            }
        }
    }
}
//向上提升深度到同一深度
pair<int, int> liftDeepth(int u,int v,vector<vector<int>>& up,vector<int>& depth){
    pair<int,int> temp;
    if(depth[u]<depth[v]){
        int k=depth[v]-depth[u];
        int curpos=v;
        for(int i=0;i<=19;i++){
            bool bit=(k>>i)&1;
            if(bit){
                curpos=up[i][curpos];
            }
        }
        temp={u,curpos};
    }else if(depth[v]<depth[u]){
        int k=depth[u]-depth[v];
        int curpos=u;
        for(int i=0;i<=19;i++){
            bool bit=(k>>i)&1;
            if(bit){
                curpos=up[i][curpos];
            }
        }
        temp={curpos,v};
    }else{
        temp={u,v};
    }
    return temp;
}
//同步向上跳跃,找到最大的不相同
int findfather(int u,int v,vector<int>& depth,vector<vector<int>>& up){
    int i=19;
    for(;i>=0;i--){
        int tmp=1<<i;
        if((tmp>depth[u]-1)) continue;
        if(up[i][u]!=up[i][v]){
            u=up[i][u];
            v=up[i][v];
        }
    }
    return u;
}
int main() {
    int n,m,r;
    cin>>n>>m>>r;
    vector<vector<int>> adj(n+1);
    for(int i=0;i<n-1;i++){
        int x,y;
        cin>>x>>y;
        adj[x].push_back(y);
    }
    //预处理
    vector<int> depth(n+1);
    vector<vector<int>> up(20,vector<int>(n+1,0));
    calculateDepthDFS(r, r, 1, up, depth, adj);
    DoubleCreationtable(n, up, depth);
    while (m--) {
        int a,b;
        cin>>a>>b;
        pair<int, int> cur;
        if(depth[a] != depth[b]){
            cur=liftDeepth(a, b, up, depth);
        }else{
            cur={a,b};
        }
        if(cur.first==cur.second){
            cout<<cur.first<<endl;
        }else{
            int u=findfather(cur.first, cur.second, depth, up);
            cout<<up[0][u]<<endl;
        }
    }
    return 0;
}
// 64 位输出请用 printf("%lld")