#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int rd()
{
int x = 0, f = 0; char v = 0;
while(!isdigit(v)) v = getchar(), f ^= v == '-' ;
while(isdigit(v)) x = (x << 1) + (x << 3) + (v ^ 48), v = getchar();
return f ? -x : x;
}
const int N = 5e5 + 10;
int hd[N], nxt[N << 1], to[N << 1], edtot;
inline void addedge(int u, int v)
{
nxt[++edtot] = hd[u];
hd[u] = edtot;
to[edtot] = v;
}
int n, qq, rt;
int dfn[N], sign, dep[N];
int mn[N << 1][19];
int Log[N << 1];
inline void dfs(int u, int f)
{
dep[u] = dep[f] + 1;
mn[++sign][0] = u;
dfn[u] = sign;
int v;
for(int e = hd[u]; e; e = nxt[e]) if((v = to[e]) ^ f)
{
dfs(v, u);
mn[++sign][0] = u;
}
}
inline int LCA(int u, int v)
{
int l = dfn[u], r = dfn[v];
if(l > r) l ^= r ^= l ^= r;
int k = Log[r - l + 1];
u = mn[l][k], v = mn[r - (1 << k) + 1][k];
return dep[u] < dep[v] ? u : v;
}
int main()
{
n = rd(), qq = rd(), rt = rd();
for(int e = 1, u, v; e < n; ++e)
u = rd(), v = rd(), addedge(u, v), addedge(v, u);
dfs(rt, 0);
for(int i = 2; i <= sign; ++i) Log[i] = Log[i >> 1] + 1;
for(int j = 1, u, v; j < 19; ++j)
for(int i = 1; (i + (1 << j) - 1) <= sign; ++i)
{
if(dep[u = mn[i][j - 1]] < dep[v = mn[i + (1 << (j - 1))][j - 1]])
mn[i][j] = u;
else mn[i][j] = v;
}
for(int i = 1, u, v; i <= qq; ++i)
{
u = rd(), v = rd();
cout << LCA(u, v) << '\n';
}
return 0;
}