#include <cstdint>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    constexpr int MOD = 1e9 + 7;

    // construct
    int n, k; cin >> n >> k;
    vector<vector<int>> tree(n);
    vector<bool> marked(n);

    for (int i = 0; i != k; ++i) {
        int index; cin >> index; --index;
        marked[index] = true;
    }

    for (int i = 0; i != n - 1; ++i) {
        int u, v; cin >> u >> v; --u; --v;
        tree[u].push_back(v);
        tree[v].push_back(u);
    }

    // dfs
    vector<bool> visited(n);
    auto dfs = [&](auto&& dfs, int node, int parent) -> int {
        visited[node] = true;
        int count = 0;
        for (int neighbor : tree[node]) {
            if (!marked[neighbor]) {
                ++count;
            } else if (neighbor != parent) {
                count += dfs(dfs, neighbor, node);
            }
        }
        return count;
    };

    int count = 0;
    uintmax_t ways = 1;
    for (int i = 0; i < marked.size(); ++i) {
        if (marked[i] && !visited[i]) {
            ++count;
            ways = (ways * dfs(dfs, i, -1)) % MOD;
        }
    }

    cout << count << ' ' << ways;
}
// 64 位输出请用 printf("%lld")