#include <iostream>
#include <bits/stdc++.h>
using namespace std;
vector< int > sum( 100000001 ) ;
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] ) {
dfs( it,graph,visited,parent,value) ;
parent[ it] = node;
}
}
int s= 0 ;
for ( auto it: graph[ node] ) {
if ( it== parent[ node] ) {
//nothing
}
else {
s= max( 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 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8aW50PnN1bSgxMDAwMDAwMDEpOwoKdm9pZCBkZnMoaW50IG5vZGUsdmVjdG9yPHZlY3RvcjxpbnQ+PmdyYXBoLHZlY3Rvcjxib29sPiZ2aXNpdGVkLHZlY3RvcjxpbnQ+JnBhcmVudCx2ZWN0b3I8aW50PnZhbHVlKXsKCXZpc2l0ZWRbbm9kZV09dHJ1ZTsKCQoJZm9yKGF1dG8gaXQ6Z3JhcGhbbm9kZV0pewoJCWlmKCF2aXNpdGVkW2l0XSl7CgkJCWRmcyhpdCxncmFwaCx2aXNpdGVkLHBhcmVudCx2YWx1ZSk7CgkJCXBhcmVudFtpdF09bm9kZTsKCQl9Cgl9CgkKCWludCBzPTA7Cglmb3IoYXV0byBpdDpncmFwaFtub2RlXSl7CgkJaWYoaXQ9PXBhcmVudFtub2RlXSl7CgkJCS8vbm90aGluZyAKCQl9CgkJCgkJZWxzZXsKCQkJcz1tYXgocyxzdW1baXRdKTsKCQl9Cgl9CgkKCXN1bVtub2RlXT12YWx1ZVtub2RlXStzOwoJCn0KaW50IG1haW4oKXsKCWludCBuOwoJY2luPj5uOwoJCgl2ZWN0b3I8dmVjdG9yPGludD4+Z3JhcGgobik7CglpbnQgbT1uLTE7CgkKCWludCBpPTE7Cgl3aGlsZShpPD1tKXsKCQlpbnQgeCx5OwoJCWNpbj4+eD4+eTsKCQl4LS0seS0tOwoJCQoJCWdyYXBoW3hdLnB1c2hfYmFjayh5KTsKCQlncmFwaFt5XS5wdXNoX2JhY2soeCk7CgkJCgkJaSsrOwoJfQoJCgl2ZWN0b3I8aW50PnZhbHVlKG4pOwoJCglmb3IoaW50IGk9MDtpPG47aSsrKXsKCQljaW4+PnZhbHVlW2ldOwoJfQoJCgl2ZWN0b3I8Ym9vbD52aXNpdGVkKG4sZmFsc2UpOwoJdmVjdG9yPGludD5wYXJlbnQobiwtMSk7CgkKCWRmcygwLGdyYXBoLHZpc2l0ZWQscGFyZW50LHZhbHVlKTsKCQoJaW50IGFuc3dlcj1JTlRfTUlOOwoJZm9yKGludCBpPTA7aTxuO2krKyl7CgkJY291dDw8IlN1bSBvZiBzdWJ0cmVlIHJvb3RlZCBhdCAiPDxpKzE8PCIgOiAiPDxzdW1baV08PGVuZGw7CgkJYW5zd2VyPW1heChhbnN3ZXIsc3VtW2ldKTsKCX0KCQoJY291dDw8Ik1heCBzdW0gOiAiPDxhbnN3ZXI8PGVuZGw7CglyZXR1cm4gMDsKfQ==