#include <bits/stdc++.h>
using namespace std;
vector<int> vec[101000];
long long dp[101000][2];
long long ans, w[101000];
int n;
long long rec[101000];
void dfs(int u, int fa) {
  for (int i = 0; i < vec[u].size(); i++) {
    int v = vec[u][i];
    if (v == fa) continue;
    dfs(v, u);
    dp[u][0] = max(dp[u][0], dp[v][0]);
    dp[u][1] = max(dp[u][1], dp[v][1]);
  }
  w[u] += dp[u][0];
  w[u] -= dp[u][1];
  if (w[u] > 0)
    dp[u][1] += w[u];
  else
    dp[u][0] -= w[u];
}
int main() {
  while (cin >> n) {
    for (int i = 1; i <= n; i++) {
      vec[i].clear();
    }
    for (int i = 0; i < n - 1; i++) {
      int a, b;
      cin >> a >> b;
      vec[a].push_back(b);
      vec[b].push_back(a);
    }
    for (int i = 1; i <= n; i++) {
      cin >> w[i];
    }
    memset(dp, 0, sizeof(dp));
    ans = 0;
    dfs(1, 0);
    cout << dp[1][0] + dp[1][1] << endl;
  }
  return 0;
}
