#include <bits/stdc++.h>

#ifdef THEMIS
#include "testlib_themis.h"
const std::string TASK_NAME = "TREEPART";
#else
#include "testlib.h"
#endif // THEMIS

using namespace std;

/**
 * Checker cho bài toán TREEPART (Phân hoạch rừng cây)
 * Logic chấm:
 * 1. Đọc Input: Cấu trúc cây, danh sách đỉnh nguồn, giới hạn d.
 * 2. Đọc Output thí sinh: Số lượng cạnh loại bỏ (s) và danh sách chỉ số cạnh.
 * 3. Kiểm tra tính hợp lệ:
 *    - Các chỉ số cạnh phải nằm trong khoảng [1, n-1] và không trùng nhau.
 *    - Dựng đồ thị mới sau khi loại bỏ các cạnh.
 *    - Chạy Multi-source BFS từ các đỉnh nguồn.
 *    - Đảm bảo mọi đỉnh trong đồ thị đều có khoảng cách <= d tới ít nhất một nguồn.
 * 4. So sánh tối ưu:
 *    - So sánh s của thí sinh với s của Jury.
 */

void check() {
    // --- 1. Đọc dữ liệu từ Input ---
    int n = inf.readInt();
    int k = inf.readInt();
    int d = inf.readInt();

    // Đọc danh sách các đỉnh nguồn
    vector<int> sources;
    for (int i = 0; i < k; ++i) {
        sources.push_back(inf.readInt());
    }

    // Đọc danh sách cạnh của cây ban đầu (1-based index)
    // Lưu lại u, v để phục vụ việc dựng lại đồ thị
    // edge_list[i] lưu cạnh có chỉ số i
    vector<pair<int, int>> edge_list(n);
    for (int i = 1; i < n; ++i) {
        edge_list[i].first = inf.readInt();
        edge_list[i].second = inf.readInt();
    }

    // --- 2. Đọc kết quả của Jury (Answer) ---
    // Chỉ cần đọc số lượng cạnh tối đa mà Jury tìm được để so sánh
    int ans_count = ans.readInt();

    // --- 3. Đọc kết quả của Thí sinh (Output) ---
    // Đọc số lượng cạnh thí sinh loại bỏ
    int user_count = ouf.readInt(0, n - 1, "user_count");

    // Đọc danh sách các chỉ số cạnh bị loại bỏ
    set<int> removed_set;
    for (int i = 0; i < user_count; ++i) {
        int idx = ouf.readInt(1, n - 1, "edge_index");
        if (removed_set.count(idx)) {
            quitf(_wa, "Output contains duplicate edge index: %d", idx);
        }
        removed_set.insert(idx);
    }

    // --- 4. Kiểm tra tính đúng đắn của phương án (Validation) ---

    // Xây dựng đồ thị mới sau khi loại bỏ cạnh (Adjacency list)
    vector<vector<int>> adj(n + 1);
    for (int i = 1; i < n; ++i) {
        // Nếu cạnh i KHÔNG nằm trong tập bị loại bỏ thì thêm vào đồ thị
        if (removed_set.find(i) == removed_set.end()) {
            int u = edge_list[i].first;
            int v = edge_list[i].second;
            adj[u].push_back(v);
            adj[v].push_back(u);
        }
    }

    // Sử dụng Multi-source BFS để tính khoảng cách ngắn nhất từ bất kỳ nguồn nào
    queue<int> q;
    vector<int> dist(n + 1, -1); // -1: chưa thăm / không đến được nguồn

    // Khởi tạo BFS từ tất cả các đỉnh nguồn
    for (int s : sources) {
        // Nếu nguồn chưa được thăm (trong trường hợp input có lặp nguồn)
        if (dist[s] == -1) {
            dist[s] = 0;
            q.push(s);
        }
    }

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

        // Tối ưu: Nếu khoảng cách hiện tại >= d, các đỉnh kề sẽ có dist > d,
        // nên không cần duyệt tiếp để lan truyền (chúng sẽ giữ giá trị -1 và bị bắt lỗi sau)
        if (dist[u] >= d) continue;

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

    // Kiểm tra tất cả các đỉnh
    for (int i = 1; i <= n; ++i) {
        // Nếu dist[i] == -1 nghĩa là đỉnh i không kết nối với bất kỳ nguồn nào
        // hoặc khoảng cách đến nguồn gần nhất > d (do ta chặn BFS tại d)
        if (dist[i] == -1 || dist[i] > d) {
            quitf(_wa, "Invalid solution: Node %d is not within distance %d of any source in its component.", i, d);
        }
    }

    // --- 5. So sánh kết quả với Jury (Scoring) ---
    if (user_count < ans_count) {
        quitf(_wa, "Solution valid but not optimal. User removed %d edges, Jury removed %d edges.", user_count, ans_count);
    } else if (user_count > ans_count) {
        // Trường hợp thí sinh tìm ra nghiệm tốt hơn Jury (Test yếu hoặc Jury sai)
        quitf(_fail, "User found a better solution (%d) than Jury (%d). Check test data!", user_count, ans_count);
    } else {
        quitf(_ok, "Correct! Removed %d edges.", user_count);
    }
}

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