#include<bits/stdc++.h>

#ifdef THEMIS
#include "testlib_themis.h"
const std::string TASK_NAME = "MAXSUBTREE"; // Tên bài
#else
#include "testlib.h"
#endif // THEMIS

using namespace std;

// Hàm BFS để tính khoảng cách từ một đỉnh start tới tất cả các đỉnh khác
vector<int> bfs_dist(int start, int n, const vector<vector<int>>& adj) {
    vector<int> dist(n + 1, -1);
    queue<int> q;

    dist[start] = 0;
    q.push(start);

    while (!q.empty()) {
        int u = q.front();
        q.pop();

        for (int v : adj[u]) {
            if (dist[v] == -1) {
                dist[v] = dist[u] + 1;
                q.push(v);
            }
        }
    }
    return dist;
}

void check() {
    // 1. Đọc dữ liệu đầu vào (Input)
    int n = inf.readInteger();
    // Sử dụng danh sách kề để lưu đồ thị
    vector<vector<int>> adj(n + 1);
    for (int i = 0; i < n - 1; i++) {
        int u = inf.readInteger();
        int v = inf.readInteger();
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    // 2. Đọc kết quả của Jury (Model output)
    int juryRes = ans.readInteger();
    // Đọc bỏ 3 đỉnh của Jury vì ta chỉ cần so sánh độ lớn kết quả,
    // hoặc kiểm tra tính đúng đắn của output thí sinh độc lập.
    ans.readInteger();
    ans.readInteger();
    ans.readInteger();

    // 3. Đọc kết quả của Thí sinh (User output)
    int userRes = ouf.readInteger();
    int uA = ouf.readInteger();
    int uB = ouf.readInteger();
    int uC = ouf.readInteger();

    // 4. Kiểm tra cơ bản
    // Kiểm tra phạm vi của các đỉnh
    if (uA < 1 || uA > n || uB < 1 || uB > n || uC < 1 || uC > n) {
        quitf(_wa, "Dinh in ra khong nam trong pham vi [1, %d]. In ra: %d %d %d", n, uA, uB, uC);
    }

    // Kiểm tra 3 đỉnh có phân biệt không
    if (uA == uB || uA == uC || uB == uC) {
        quitf(_wa, "3 dinh phai phan biet. In ra: %d %d %d", uA, uB, uC);
    }

    // 5. Kiểm tra logic đồ thị
    // Chạy BFS để tính khoảng cách giữa các cặp đỉnh mà thí sinh in ra
    // Ta cần dist(A, B), dist(B, C), dist(C, A)
    // Chỉ cần chạy BFS từ A và BFS từ B là đủ để lấy cả 3 khoảng cách này.

    vector<int> distFromA = bfs_dist(uA, n, adj);
    vector<int> distFromB = bfs_dist(uB, n, adj);

    // Kiểm tra tính liên thông (đề phòng input lỗi hoặc logic sai, dù đề bài đảm bảo là cây)
    if (distFromA[uB] == -1 || distFromB[uC] == -1 || distFromA[uC] == -1) {
        quitf(_fail, "Loi he thong: Do thi khong lien thong hoac input sai.");
    }

    long long dAB = distFromA[uB];
    long long dBC = distFromB[uC];
    long long dCA = distFromA[uC];

    // Số cạnh của đồ thị con cực tiểu chứa 3 đỉnh = (dAB + dBC + dCA) / 2
    long long totalDist = dAB + dBC + dCA;

    // Tổng khoảng cách đôi một trong cây luôn là số chẵn
    if (totalDist % 2 != 0) {
        quitf(_fail, "Loi he thong: Tong khoang cach doi mot la so le (%lld).", totalDist);
    }

    int actualSize = (int)(totalDist / 2);

    // 6. So sánh và kết luận

    // Kiểm tra xem số cạnh thí sinh in ra (userRes) có khớp với thực tế 3 đỉnh đã chọn không
    if (userRes != actualSize) {
        quitf(_wa, "So canh in ra (%d) khong khop voi so canh thuc te tao boi 3 dinh (%d)", userRes, actualSize);
    }

    // So sánh với đáp án chuẩn
    if (userRes < juryRes) {
        quitf(_wa, "Ket qua tim duoc (%d) nho hon dap an toi uu (%d)", userRes, juryRes);
    }

    if (userRes > juryRes) {
        quitf(_wa, "Ket qua tim duoc (%d) lon hon dap an toi uu (%d) -> Dap an Jury sai hoac ban 'hack'?", userRes, juryRes);
    }

    // Nếu vượt qua tất cả bài kiểm tra
    quitf(_ok, "Chinh xac! So canh: %d. 3 dinh: %d %d %d", userRes, uA, uB, uC);
}

int main(int argc, char *argv[]) {
#ifdef THEMIS
    registerTestlibThemis(TASK_NAME + ".inp", TASK_NAME + ".out");
#else
    registerTestlibCmd(argc, argv);
#endif
    check();
    return 0;
}
