#include <stdio.h>
#include <stdlib.h>
int n, cnt = 0;
struct edge {
int to, next;
}e[400010];
int w[200010];
int head[200010];
int ans = 0, maxx = -1;

void addedge(int u, int v) {
e[++cnt].to = v;
e[cnt].next=head[u];
head[u]=cnt;
}

int main()
{
    scanf("%d",&n);
    for(int i = 1;i < n; i++) {
        int u, v;
        scanf("%d%d",&u,&v);
        addedge(u,v), addedge(v, u);
    }
    for(int i = 1;i <= n; i++) {
        scanf("%d",&w[i]);
    }
    for(int i = 1;i < n; i++) {
        int max1=-1,max2=-1,t=0,wx;
        for(int j = head[i];j;j=e[j].next) {
            wx = w[e[j].to];
            t = t+wx, t%=10007;
            if(wx>max1) {
                max2 = max1;
                max1 = wx;
            }
            else if(wx>max2) {
                max2=wx;
            }
        }
        max1 *= max2;
        if(max1 > maxx) maxx = max1;
        for(int j = head[i];j;j=e[j].next) {
            wx = w[e[j].to];
            ans += wx*(t-wx), ans %= 10007;
        }
    }
    ans = (ans + 10007)%10007;
    printf("%d %d\n",maxx,ans);
    return 0;
}
/**************************************************************
	Problem: 2335
	User: admin
	Language: C
	Result: Accepted
	Time:369 ms
	Memory:5832 kb
****************************************************************/