#include <iostream>
#include <vector>
#define ll long long
using namespace std;
const int N = 1e5 + 10;
int n;
vector<int> G[N];
int c[N];
ll sum[N];
ll ss, ans = -1;
ll sumtree(int node, int pre){
for (int i = 0; i<G[node].size(); i++){
if (G[node][i] == pre) continue;
sum[node] += sumtree(G[node][i], node);
}
sum[node] += (ll)c[node];
return sum[node];
}
void dfs1(int node, int pre, int depth){
ss += depth * (ll)c[node];
for (int i = 0; i<G[node].size(); i++){
if (G[node][i] == pre) continue;
dfs1(G[node][i], node, depth + 1);
}
}
void dfs2(int node, int pre, int flast){
ll fnow = flast + sum[1] - 2 * sum[node];
if (ans == -1 || fnow < ans){
ans = fnow;
}
for (int i = 0; i<G[node].size(); i++){
if (G[node][i] == pre) continue;
dfs2(G[node][i], node, fnow);
}
}
int main(){
cin >> n;
for (int i = 1; i<n; i++){
int a, b;
cin >> a >> b;
G[a].push_back(b);
G[b].push_back(a);
}
for (int i = 1; i<=n; i++){
cin >> c[i];
}
sumtree(1, -1);
dfs1(1, -1, 0);
for (int i = 0; i<G[1].size(); i++){
dfs2(G[1][i], 1, ss);
}
cout << ans << endl;
return 0;
}