#include<bits/stdc++.h> using namespace std; const int maxn=5e5+10; vector<int>g[maxn]; int head[maxn],tot; void add(int fr,int to){ g[fr].push_back(to); g[to].push_back(fr); } int size[maxn];//子树大小 int fath[maxn];// int maxson[maxn];// int depth[maxn]; void dfs1(int u,int fa){ depth[u]=depth[fa]+1; fath[u]=fa; size[u]++; int maxsize=0; for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(v==fa)continue; dfs1(v,u); size[u]+=size[v]; if(maxsize<size[v]){maxsize=size[v];maxson[u]=v;} } } int dfn[maxn];int thehead[maxn]; int totdfn=0; void dfs2(int u,int fa,int _head){ dfn[u]=++totdfn; thehead[u]=_head; if(!maxson[u])return; dfs2(maxson[u],u,_head); for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(v==fa)continue; if(v==maxson[u])continue; dfs2(v,u,v); } } int lca(int c,int d){ while(thehead[c]!=thehead[d]){ if(depth[thehead[c]]<depth[thehead[d]]){//d c>>d d swap(c,d); }; c=fath[thehead[c]]; } if(depth[c]>depth[d])return d; else return c; } int n,m,root; signed main(){ //freopen("C:\Users\11631\Desktop\P3379_2.in","r",stdin); cin>>n>>m>>root; for(int i=1;i<=n-1;i++){ int x,y; scanf("%d%d",&x,&y); add(x,y); } dfs1(root,0); dfs2(root,0,root); while(m--){ int a,b; scanf("%d%d",&a,&b); cout<<lca(a,b)<<endl; } return 0; }