#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int mod=10007,maxn=2e5+5;
int n,cnt,Max,Sum;
int last[maxn],w[maxn];
struct Edge
{
int to,val,nxt;
} a[maxn<<1];
void Add(int x,int y)
{
a[++cnt].to=y;
a[cnt].nxt=last[x];
last[x]=cnt;
}
void work(int x)
{
int s=0,m1=0,m2=0;
for(int i=last[x];i;i=a[i].nxt)
{
int y=a[i].to;
if(w[y]>m1) m2=m1,m1=w[y];
else if(w[y]>m2) m2=w[y];
Sum=(Sum+w[y]*s)%mod;
s+=w[y];
}
Max=max(Max,m1*m2);
}
int main()
{
int u,v;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d %d",&u,&v);
Add(u,v),Add(v,u);
}
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=1;i<=n;i++) work(i);
printf("%d %d\n",Max,(Sum<<1)%mod);
return 0;
}