#include<bits/stdc++.h>
using namespace std;
const long long N = 1000010;
long long c;
long long n,d[N];
long long x,y;
long long head[N*2],tot;
long long sum,ans[N];
struct Edge{
long long to,nxt;
}e[N*2];
void add(long long u,long long v){
e[++tot].to=v;
e[tot].nxt=head[u];
head[u]=tot;
}
void dfs_dp(long long u,long long f){
for(long long i=head[u];i;i=e[i].nxt){
long long v=e[i].to;
if(v==f) continue;
for(long long j=i;j;j=e[j].nxt){
long long vv=e[j].to;
if(vv==v || vv==f) continue;
ans[vv]+=d[vv]*d[v];
ans[v]+=d[vv]*d[v];
c=max(c,d[vv]*d[v]);
}
ans[v]+=d[f]*d[v];
ans[f]+=d[f]*d[v];
c=max(c,d[f]*d[v]);
dfs_dp(v,u);
}
}
int main(){
scanf("%lld",&n);
for(long long i=1;i<n;i++){
scanf("%lld%lld",&x,&y);
add(x,y);
add(y,x);
}
for(long long i=1;i<=n;i++) scanf("%lld",&d[i]);
dfs_dp(1,0);
for(long long i=1;i<=n;i++){
sum+=ans[i];
}
cout<<c<<" "<<sum%10007;
return 0;
}