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

int main() {
    int n;
    cin >> n;
    
    // 邻接表表示图
    vector<int> adj[n + 1];
    
    // 输入边
    for (int i = 1; i < n; ++i) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    
    // 输入权值
    vector<int> W(n + 1);
    for (int i = 1; i <= n; ++i) {
        cin >> W[i];
    }
    
    int max_product = 0;  // 最大联合权值
    long long total_sum = 0;  // 所有联合权值的总和
    
    // 遍历每个节点k
    for (int k = 1; k <= n; ++k) {
        // 遍历k的所有邻居u
        for (int i = 0; i < adj[k].size(); ++i) {
            int u = adj[k][i];
            // 遍历k的所有邻居v(v > u,避免重复计算)
            for (int j = i + 1; j < adj[k].size(); ++j) {
                int v = adj[k][j];
                int product = W[u] * W[v];
                if (product > max_product) {
                    max_product = product;
                }
                total_sum += product;
            }
        }
    }
    
    // 由于(u,v)和(v,u)是两种不同的有序点对,总和需要乘以2
    total_sum *= 2;
    
    cout << max_product << " " << total_sum << endl;
    
    return 0;
}
/**************************************************************
	Problem: 2335
	User: admin
	Language: C++
	Result: Time Limit Exceed
****************************************************************/