#include<bits/stdc++.h>usingnamespacestd;classTree{public:intn;vector<vector<int>>adj;vector<longlong>dp,a;// dp[i] is the maximum coins collected when you start your journey at node
// i.
Tree(intn){this->n=n;adj.resize(n);a.resize(n);dp.resize(n);}voiddfs(intsrc,intpar){dp[src]=a[src];for(autochild:adj[src]){if(child==par){continue;}dfs(child,src);dp[src]=max(dp[src],dp[src]+dp[child]);}}};voidsolve(){intn;cin>>n;Treet(n);for(inti=0;i<n-1;i++){intx,y;cin>>x>>y;t.adj[x].push_back(y);t.adj[y].push_back(x);}for(inti=0;i<n;i++){cin>>t.a[i];}t.dfs(0,-1);cout<<t.dp[0]<<endl;}intmain(){solve();return0;}