#include <iostream>
#include <bits/stdc++.h>
using namespace std;
vector< int > sum( 1000001 ) ;
void dfs( int node,vector< vector< int >> graph,vector< bool > & visited,vector< int > & parent,vector< int > value) {
visited[ node] = true ;
for ( auto it: graph[ node] ) {
if ( ! visited[ it] ) {
parent[ it] = node;
dfs( it,graph,visited,parent,value) ;
}
}
int s= 0 ;
for ( auto it: graph[ node] ) {
if ( it== parent[ node] ) {
//nothing
}
else {
s= s+ sum[ it] ;
}
}
sum[ node] = value[ node] + s;
}
int main( ) {
int n;
cin >> n;
vector< vector< int >> graph( n) ;
int m= n- 1 ;
int i= 1 ;
while ( i<= m) {
int x,y;
cin >> x>> y;
x-- ,y-- ;
graph[ x] .push_back ( y) ;
graph[ y] .push_back ( x) ;
i++ ;
}
vector< int > value( n) ;
for ( int i= 0 ; i< n; i++ ) {
cin >> value[ i] ;
}
vector< bool > visited( n,false ) ;
vector< int > parent( n,- 1 ) ;
dfs( 0 ,graph,visited,parent,value) ;
int answer= INT_MIN ;
for ( int i= 0 ; i< n; i++ ) {
cout << "Sum of subtree rooted at " << i+ 1 << " : " << sum[ i] << endl;
answer= max( answer,sum[ i] ) ;
}
cout << "Max sum : " << answer<< endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZlY3RvcjxpbnQ+c3VtKDEwMDAwMDEpOwoKdm9pZCBkZnMoaW50IG5vZGUsdmVjdG9yPHZlY3RvcjxpbnQ+PmdyYXBoLHZlY3Rvcjxib29sPiZ2aXNpdGVkLHZlY3RvcjxpbnQ+JnBhcmVudCx2ZWN0b3I8aW50PnZhbHVlKXsKCXZpc2l0ZWRbbm9kZV09dHJ1ZTsKCQoJZm9yKGF1dG8gaXQ6Z3JhcGhbbm9kZV0pewoJCWlmKCF2aXNpdGVkW2l0XSl7CgkJCXBhcmVudFtpdF09bm9kZTsKCQkJZGZzKGl0LGdyYXBoLHZpc2l0ZWQscGFyZW50LHZhbHVlKTsKCQkJCgkJfQoJfQoJCglpbnQgcz0wOwoJZm9yKGF1dG8gaXQ6Z3JhcGhbbm9kZV0pewoJCWlmKGl0PT1wYXJlbnRbbm9kZV0pewoJCQkvL25vdGhpbmcgCgkJfQoJCQoJCWVsc2V7CgkJCXM9cytzdW1baXRdOwoJCX0KCX0KCQoJc3VtW25vZGVdPXZhbHVlW25vZGVdK3M7CgkKfQppbnQgbWFpbigpewoJaW50IG47CgljaW4+Pm47CgkKCXZlY3Rvcjx2ZWN0b3I8aW50Pj5ncmFwaChuKTsKCWludCBtPW4tMTsKCQoJaW50IGk9MTsKCXdoaWxlKGk8PW0pewoJCWludCB4LHk7CgkJY2luPj54Pj55OwoJCXgtLSx5LS07CgkJCgkJZ3JhcGhbeF0ucHVzaF9iYWNrKHkpOwoJCWdyYXBoW3ldLnB1c2hfYmFjayh4KTsKCQkKCQlpKys7Cgl9CgkKCQoJdmVjdG9yPGludD52YWx1ZShuKTsKCWZvcihpbnQgaT0wO2k8bjtpKyspewoJCWNpbj4+dmFsdWVbaV07Cgl9CgkKCXZlY3Rvcjxib29sPnZpc2l0ZWQobixmYWxzZSk7Cgl2ZWN0b3I8aW50PnBhcmVudChuLC0xKTsKCQoJCglkZnMoMCxncmFwaCx2aXNpdGVkLHBhcmVudCx2YWx1ZSk7CgkKCWludCBhbnN3ZXI9SU5UX01JTjsKCWZvcihpbnQgaT0wO2k8bjtpKyspewoJCWNvdXQ8PCJTdW0gb2Ygc3VidHJlZSByb290ZWQgYXQgIjw8aSsxPDwiIDogIjw8c3VtW2ldPDxlbmRsOwoJCWFuc3dlcj1tYXgoYW5zd2VyLHN1bVtpXSk7Cgl9CgkKCWNvdXQ8PCJNYXggc3VtIDogIjw8YW5zd2VyPDxlbmRsOwoJcmV0dXJuIDA7Cn0=