#include <bits/stdc++.h>
using namespace std;
vector<int> g[100001];
long long v[100001];
pair<long long, long long> r[100001];
int mark[100001];
void dfs(int s) {
  mark[s] = 1;
  r[s] = pair<long long, long long>(0, 0);
  for (int i = 0; i < g[s].size(); i++) {
    if (!mark[g[s][i]]) {
      dfs(g[s][i]);
      r[s].first = min(r[s].first, r[g[s][i]].first);
      r[s].second = max(r[s].second, r[g[s][i]].second);
    }
  }
  long long k = v[s] - r[s].first - r[s].second;
  if (k > 0)
    r[s].second = r[s].second + k;
  else
    r[s].first += k;
}
int main() {
  int n;
  memset(mark, 0, sizeof mark);
  cin >> n;
  int a, b;
  for (int i = 0; i < n - 1; i++) {
    cin >> a >> b;
    g[a - 1].push_back(b - 1);
    g[b - 1].push_back(a - 1);
  }
  for (int i = 0; i < n; i++) cin >> v[i];
  dfs(0);
  long long ans = -r[0].first + r[0].second;
  cout << ans << endl;
  return 0;
}
