#include<iostream>
#include<fstream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<list>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<climits>
#include<ctime>
#include<sstream>
#define mp make_pair
#define pb push_back
#define st first
#define nd second
#define wait getchar();getchar();
#define lint long long
#define KARE(a) ( (a)*(a) )
#define MAX(a,b) ( (a)>(b) ? (a) : (b) )
#define MIN(a,b) ( (a)<(b) ? (a) : (b) )
#define MAX3(a,b,c) ( MAX( a,MAX(b,c) ) )
#define MIN3(a,b,c) ( MIN( a,MIN(b,c) ) )
#define FILL(ar,a) memset( ar,a,sizeof ar )
#define oo 1e9
#define pii pair<int,int>
#define pll pair<lint,lint>
#define pdd pair<double,double>
#define y1 yy1
#define eps (1e-9)
#define esit(a,b) ( abs( (a)-(b) ) < eps )
#define sol(a) ( (a)<<1 )
#define sag(a) ( sol(a)|1 )
#define orta(a,b) ( ( (a)+(b) )>>1 )
#define mxn 200005
using namespace std;
vector<int>adj[mxn],ch[mxn];
set< pii >s;
set< pii >::iterator it;
int n,d[mxn];
int sta[mxn],fin[mxn],no;
int dp[mxn];
int snod[mxn],ssol[mxn],top;
int ans;
void read(){
freopen( "guvern.in" , "r" , stdin );
freopen( "guvern.out" , "w" , stdout );
int a,b,i;
scanf( "%d", &n );
for( i=1 ; i<n ; i++ ){
scanf( "%d %d" , &a , &b );
adj[a].pb( b );
adj[b].pb( a );
}
for( i=1 ; i<=n ; i++ ) scanf( "%d" , d+i );
return;
}
void find( int nod ){
int i,b,c;
for( i=0 ; i<ch[nod].size() ; i++ ){
b = ch[nod][i];
c = 0;
while( top>0 && sta[b]<=sta[ snod[top] ] && fin[b]>=fin[ snod[top] ] ) c += ssol[top--];
top++;
snod[top] = b;
ssol[top] = MAX( c,dp[b] );
}
dp[nod] = 1;
while( top>0 ) dp[nod] += ssol[top--];
return;
}
void tree( int nod,int par ){
int i,p;
sta[nod] = ++no;
s.insert( mp( d[nod],nod ) );
for( i=0 ; i<adj[nod].size() ; i++ )
if( adj[nod][i]!=par ) tree( adj[nod][i],nod );
s.erase( mp( d[nod],nod ) );
fin[nod] = no;
it = s.upper_bound( mp( d[nod],0 ) );
if( it != s.end() ) ch[it->nd].pb( nod );
find( nod );
return;
}
void solve(){
read();
tree( 1,1 );
for( int i=1 ; i<=n ; i++ ) ans = MAX( ans,dp[i] );
printf( "%d\n" , ans );
return;
}
int main(){
solve();
return 0;
}