rt,WA on #10
#include<bits/stdc++.h>
#define INF 1e16
#define endl '\n'
#define PI acos(-1)
#define pb push_back
#define int long long
#define mem(x,v) memset(x,v,sizeof x)
using namespace std;
const int N = 2e5+5;
inline int read(){
register int x=0,f=1;register char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,sum,cnt,ans;
int head[N],a[N],siz[N],f[N];
struct Edge{int to,next;}edge[N<<1];
void add(int u,int v){edge[++cnt]={v,head[u]};head[u]=cnt;}
void dfs(int u,int fa){
siz[u]=a[u],sum+=a[u];
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa)continue;
dfs(v,u),siz[u]+=siz[v];
f[u]+=f[v]+siz[v];
}
}
void dp(int u,int fa){
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa)continue;
f[v]=f[u]+sum-2*siz[v];
dp(v,u);
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n,ans=INF;
for(int i=1,u,v;i<n;i++)cin>>u>>v,add(u,v),add(v,u);
for(int i=1;i<=n;i++)cin>>a[i];
dfs(1,0),dp(1,0);
for(int i=1;i<=n;i++)ans=min(ans,f[i]);
cout<<ans;
return 0;
}