// ROOT : DRAGON3012009 : WA in Real Life
#include <bits/stdc++.h>
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
#define ll long long
#define el "\n"
#define fi first
#define se second
#define _ROOT_ int main()
#define M 1000000007
#define MAXN 1000001
#define Bit(i) (1LL << i )
#define INF (1ll<<30)
#define NAME "file"
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;

ll n, m, q ;
ll a[MAXN ] ;
ll sz[MAXN ] ;
vector<ll> adj[MAXN ] ;

ll Power(ll a, ll b ) { ll res = 1; while(b){ if(b&1) res = a*res%M; b>>=1; a=a*a%M; } return res; }
ll add(ll a, ll b ) { return a + b >= M ? a + b - M : a + b; }
ll mul(ll a, ll b )  { return 1LL * (a%M) * (b%M) % M; }
ll sub(ll a, ll b ) { return a - b < 0 ? a - b + M : a - b; }
ll divi(ll a, ll b) { return 1LL * a * Power(b, M - 2 ) % M; }

bool check(ll a ) {
ll t = sqrt(a ) ;
return t * t == a ;
}

void dfs(ll u , ll p ,ll &ans  ) {
    sz[u] = 1 ;
    for(ll v : adj[u]) if(v != p ) {
        dfs(v , u , ans ) ;
        sz[u] += sz[v] ;
    }
    vector<ll> val ;
    if(check(a[u])) {
        for(ll v : adj[u]) if(v != p ) val.push_back(sz[v]) ;
        val.push_back(n - sz[u]) ;

        ll sum = 0 , pairr = 0 , trip = 0 ;

        for(ll v : val ) {
            trip = add(trip , mul(pairr , v )) ;
            pairr = add(pairr , mul(sum , v )) ;
            sum = add(sum , v ) ;
        }
        ans = add(ans , pairr ) ;
        ans = add(ans , trip ) ;
    }
}

void init() {
    cin >> n ;
    FOR(i , 2 , n ) {
    ll x, y ; cin >> x >> y ;
    adj[x].push_back(y) ;
    adj[y].push_back(x) ;
    }   
    FOR(i , 1 , n ) cin >> a[i] ;

}

void solve() {
    ll ans = 0 ;
    dfs(1 , 1 , ans ) ;
    FOR(i , 1 , n ) adj[i].clear() ;
    cout << ans << el ;
}


_ROOT_ {
//    freopen(NAME".inp", "r", stdin);
//    freopen(NAME".out", "w", stdout) ;
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;// cin >> t ;
    while(t--) {
        init();
        solve();
    }
    return (0&0);
}
