#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int TAM = 100004;
vector <ll> adj [TAM];
ll val [TAM], pt [TAM];
int n;
void form( int x ){
int nxt;
for( int i = 0 ; i < adj[x].size() ; i ++ ){
nxt = adj[x][i];
if( nxt == pt[x] ) continue;
pt[nxt] = x;
//cout << " parent " << nxt << " = " << pt[nxt] << endl ;
form(nxt);
}
}
ll dn, up;
void solve ( ll cap , ll sum ){
dn = sum - cap;
up = cap - dn;
}
bool pos = 1;
ll find_up( int x ){
//cout << " IN " << x << endl ;
if( adj[x].size() == 1 ) return val[x];
ll sum = 0, cap = val[x];
int nxt;
ll v;
for( int i = 0 ; i < adj[x].size() ; i ++ ){
nxt = adj[x][i];
if( nxt == pt[x] ) continue;
v = find_up(nxt);
sum += v;
//cout << x << " -> " << nxt << " = " << v << endl ;
}
solve( cap , sum );
if( dn + up != cap or dn < 0 or up < 0 ) pos = 0;
return up;
}
int main(){
int a, b;
scanf("%d",&n);
for( int i = 1 ; i <= n ; i ++ )
scanf("%lld",&val[i]);
for( int i = 0 ; i < n-1 ; i ++ ){
scanf("%d%d",&a,&b);
adj[a].push_back(b);
adj[b].push_back(a);
}
int rt;
for( int i = 1 ; i <= n ; i ++ ){
if( adj[i].size() > 1 ){
pt [i] = i;
form(i);
rt = i;
break;
}
}
if( !find_up(rt) and pos ) printf("YES\n");
else printf("NO\n");
return 0;
}