#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=4e5+10;
const int Mod=10007;
int n,w[N];
int f[N];
int sum[N];
int now[N];
int maxn[N];
int ans1;
int ans2;
int head[N],tot;
struct Edge{
int next,to;
}e[N];
void adde(int u,int v){
e[++tot].next=head[u];
e[tot].to=v;
head[u]=tot;
return;
}
void dfs1(int u,int fa){
int m1=0,m2=0;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==fa) continue;
dfs1(v,u);
f[v]=u;
if(w[v]>m1) m2=m1,m1=w[v];
else if(w[v]>m2) m2=w[v];
sum[u]=(sum[u]+w[v])%Mod;
maxn[u]=max(maxn[u],maxn[v]);
}
maxn[u]=max(maxn[u],m1*m2);
return;
}
void dfs2(int u){
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==f[u]) continue;
dfs2(v);
now[u]+=now[v];
now[u]+=(sum[u]-w[v])*w[v];
now[u]%=Mod;
}
return;
}
void dfs3(int u){
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==f[u]) continue;
dfs3(v);
}
int fu=f[f[u]];
int val=w[u]*w[fu];
if(fu) ans1=(ans1+val*2)%Mod,ans2=max(ans2,val);
return;
}
inline int read(){
int s=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=(s<<1)+(s<<3)+(ch^48);
ch=getchar();
}
return s*f;
}
signed main(){
n=read();
for(int i=1;i<n;i++){
int u=read(),v=read();
adde(u,v);
adde(v,u);
}
for(int i=1;i<=n;i++){
w[i]=read();
}
dfs1(1,1);
dfs2(1);
dfs3(1);
cout<<max(maxn[1],ans2)<<" "<<(now[1]+ans1)%Mod<<endl;
return 0;
}