#include<bits/stdc++.h>
using namespace std;
struct node
{
long long sum,fa;
};
long long a,w[200005],ansm=-1,ans=0,mod=10007;
bool vis[200005];
vector<long long>v[200005];
void bfs()
{
queue<node>q;
long long id=1;
q.push({1ll,0});
while(q.size())
{
long long sum=0,ma1=0,ma2=0;
for(long long i=0;i<v[q.front().sum].size();i++)
{
if(vis[v[q.front().sum][i]])continue;
q.push({v[q.front().sum][i],q.front().sum});
sum+=w[v[q.front().sum][i]];
if(w[v[q.front().sum][i]]>ma2)
{
ma1=ma2;
ma2=w[v[q.front().sum][i]];
}
}
ansm=max(max(ansm,ma2*ma1),w[q.front().fa]*ma2);
for(long long i=0;i<v[q.front().sum].size();i++)
{
if(vis[v[q.front().sum][i]])continue;
sum-=w[v[q.front().sum][i]];
ans+=sum*2*v[q.front().sum][i];
ans%=mod;
ans+=w[v[q.front().sum][i]]*w[q.front().fa]*2;
ans%=mod;
}
vis[q.front().sum]=1;
q.pop();
}
}
int main()
{
cin>>a;
for(long long i=1;i<a;i++)
{
long long k,j;
cin>>k>>j;
v[k].push_back(j);
v[j].push_back(k);
}
for(long long i=1;i<=a;i++)
{
cin>>w[i];
}
bfs();
cout<<ansm<<" "<<ans;
return 0;
}