import java.util.*;
import java.io.*;
public class Main {
static List<Integer>[] g;
static int[][] fa;
static int[] depth;
public static void main(String[] args) throws Exception {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
in.nextToken();
int n = (int) in.nval;
in.nextToken();
int m = (int) in.nval;
in.nextToken();
int root = (int) in.nval;
g = new List[n + 1];
fa = new int[n + 1][20];
depth = new int[n + 1];
for (int i = 0; i <= n; i++) {
g[i] = new ArrayList<>();
}
for (int i = 1; i < n; i++) {
in.nextToken();
int x = (int) in.nval;
in.nextToken();
int y = (int) in.nval;
g[x].add(y);
g[y].add(x);
}
dfs(root, 0);
while (m-- > 0) {
in.nextToken();
int x = (int) in.nval;
in.nextToken();
int y = (int) in.nval;
System.out.println(lca(x, y));
}
}
private static void dfs(int x, int father) {
depth[x] = depth[father] + 1;
fa[x][0] = father;
for (int i = 1; (1 << i) <= depth[x]; i++) {
fa[x][i] = fa[fa[x][i - 1]][i - 1];
}
for (Integer i : g[x]) {
if (i != father) {
dfs(i, x);
}
}
}
private static int lca(int x, int y) {
if (depth[x] < depth[y]) {
int t = x;
x = y;
y = t;
}
for (int i = 19; i >= 0; i--) {
if (depth[x] - (1 << i) >= depth[y]) {
x = fa[x][i];
}
}
if (x == y) {
return x;
}
for (int i = 19; i >= 0; i--) {
if (fa[x][i] != fa[y][i]) {
x = fa[x][i];
y = fa[y][i];
}
}
return fa[x][0];
}
}