#include<bits/stdc++.h>
using namespace std;
int n,m,s,f[500001][21],d[500005];
bool bj[500005];
struct bb{
int son[1001],tot,f;
}tree[500005];
int root (int x) {return tree[x].f==0?x:root(tree[x].f);}
void dfs(int x,int fa) {
bj[x]=1;
for(int i=1;i<=tree[x].tot;i++) {
int v=tree[x].son[i];
if(bj[v]==0&&v) {
f[v][0]=x,d[v]=d[x]+1;
for(int w=1;w<=20;w++) f[v][w]=f[f[v][w-1]][w-1];
dfs(v,x);
}
}
}
int lca(int x,int y) {
if(d[y]>d[x]) swap(x,y);
for(int i=19;i>=0;i--) {
if(f[x][i]!=0&&d[f[x][i]]>=d[y]) {
x=f[x][i];
}
}
//cout<<x<<' '<<y<<endl;
if(x==y) return x;
for(int i=19;i>=0;i--) {
if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
}
return f[x][0];
}
int main() {
cin>>n>>m>>s;
for(int i=1;i<n;i++) {
int x,y;
cin>>x>>y;
// int u=++tree[x].tot;
// tree[x].son[u]=y;
int u=++tree[y].tot;
tree[y].son[u]=x;
tree[x].f=y;
}
int t=root(1);
d[0]=-1;
dfs(t,0);
// for(int i=1;i<=n;i++) {
// for(int j=0;j<=5;j++) {
// cout<<f[i][j]<<' ';
// }
// cout<<endl;
// }
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
cout<<lca(x,y)<<endl;
}
return 0;
}