#include <cstdio>
#include <iostream>
using namespace std;
char pbuf[32768], *pp = pbuf;
__inline void write(unsigned x) {
unsigned sta[35], top = 0;
do {
sta[top++] = x % 10, x /= 10;
} while (x);
while (top) {
if (pp - pbuf == 32768)
fwrite(pbuf, 1, pp - pbuf, stdout), pp = pbuf;
*pp++ = sta[--top] ^ '0';
}
}
char buf[16777216], *p1 = buf, *p2 = buf;
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 16777216, stdin), p1 == p2) ? EOF : *p1++)
__inline void R(unsigned &x) {
x = 0;
char ch = getchar();
while (!isdigit(ch)) {
ch = getchar();
}
while (isdigit(ch)) x = x * 10 + (ch ^ 48), ch = getchar();
return;
}
unsigned n, q, r;
struct b {
unsigned id, to, nxt;
};
struct t {
b v[20000100];
unsigned len, fir[10000100];
inline void add(unsigned x, unsigned y, unsigned id = 0) {
++len;
v[len].id = id;
v[len].to = y;
v[len].nxt = fir[x];
fir[x] = len;
return;
}
} tree, ask;
unsigned f[10000100];
__inline unsigned find(unsigned x) {
while (x ^ f[x]) x = f[x] = f[f[x]];
return x;
}
short vis[10001000];
unsigned ans[10000100];
void tarjan(const unsigned u) {
vis[u] = 1;
for (unsigned i = tree.fir[u]; i; i = tree.v[i].nxt) {
if (vis[tree.v[i].to])
continue;
tarjan(tree.v[i].to);
f[find(tree.v[i].to)] = find(u);
}
for (unsigned i = ask.fir[u]; i; i = ask.v[i].nxt) {
if (!(vis[ask.v[i].to] ^ 2))
ans[ask.v[i].id] = find(ask.v[i].to);
}
vis[u] = 2;
return;
}
signed main() {
// freopen("1.txt","r",stdin);
R(n);
R(q);
R(r);
for (unsigned i = 1, u, v; i ^ n; ++i) {
f[i] = i;
R(u);
R(v);
tree.add(u, v);
tree.add(v, u);
}
f[n] = n;
for (unsigned i = 1, u, v; i <= q; ++i) {
R(u);
R(v);
ask.add(u, v, i);
ask.add(v, u, i);
}
tarjan(r);
for (unsigned i = 1; i <= q; ++i) {
write(ans[i]);
if (pp - pbuf == 32768)
fwrite(pbuf, 1, pp - pbuf, stdout), pp = pbuf;
*pp++ = '\n';
}
fwrite(pbuf, 1, pp - pbuf, stdout);
return 0;
}