#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
****************************************************************/