#include<iostream>
using namespace std;
int n,ans,maxn,num,h[200005],w[200005];
struct node
{
int u,v;
} a[400005];
void add(int x,int y)
{
a[++num].u=h[x];
a[num].v=y;
h[x]=num;
}
int main()
{
cin >> n;
for(int i=1;i<n;i++)
{
int x,y;
cin >> x >> y;
add(x,y);
add(y,x);
}
for(int i=1;i<=n;i++)
cin >> w[i];
for(int i=1;i<=n;i++)
{
int max1 = 0,max2 = 0,t1 = 0,t2 = 0;
for(int j=h[i];j;j = a[j].u)
{
if(w[a[i].v] > max1)
{
max2 = max1;
max1 = w[a[j].v];
}
else if(w[a[i].v] > max2)
{
max2 = w[a[j].v];
}
t1 = (t1 + w[a[j].v]) % 10007;
t2 = (t2 + w[a[j].v] * w[a[j].v]) % 10007;
}
t1 = t1 * t1 % 10007;
ans = (ans + t1 + 10007 - t2) % 10007;
if(maxn < max1 * max2) maxn = max1 * max2;
}
cout << maxn << " " << ans << endl;
return 0;
}