#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <vector>
#include <queue>
using namespace std;
inline int read();
void write(int);
void writeln(int);
const int N = 500005;
int n, m, s, head[N], cnt, dep[N], dp[N][21];
bool vis[N];
struct node {
int nxt, to;
} e[N * 2];
void add(int x, int y) {
e[++cnt].to = y;
e[cnt].nxt = head[x];
head[x] = cnt;
}
void dfs(int x) {
vis[x] = true;
for(int i = head[x]; i; i = e[i].nxt) {
if(!vis[e[i].to]) {
dep[e[i].to] = dep[i] + 1;
dp[e[i].to][0] = x;
dfs(e[i].to);
}
}
}
void init() {
for(int j = 1; j < 20; j++)
for(int i = 1; i <= n; i++)
dp[i][j] = dp[dp[i][j - 1]][j - 1];
}
int queryLCA(int x, int y) {
if(dep[x] > dep[y]) swap(x, y);
int d = dep[y] - dep[x];
for(int i = 19; i >= 0; i--) if((d >> i) & 1) y = dp[y][i];
if(x == y) return x;
else {
for(int i = 19; i >= 0; i--)
if(dp[x][i] != dp[y][i]) {
x = dp[x][i];
y = dp[y][i];
}
return dp[x][0];
}
}
int main() {
n = read();
m = read();
s = read();
int M = n - 1;
while(M--) {
int x = read(), y = read();
add(x, y);
add(y, x);
}
dfs(s);
init();
for(int i = 1; i <= m; i++) {
int x = read(), y = read();
writeln(queryLCA(x, y));
}
return 0;
}
inline int read() {
int res = 0, f = 1;
char ch = getchar();
while( !(ch >= '0' && ch <= '9') ) {
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
res = (res << 1) + (res << 3) + (ch ^ 48);
ch = getchar();
}
return res * f;
}
void write(int x) {
static int sta[35];
int top = 0;
do {
sta[top++] = x % 10;
x /= 10;
} while(x);
while(top) putchar(sta[--top] ^ 48);
}
void writeln(int x) {
write(x);
putchar('\n');
}