#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5,mod=10007;
long long n,v[maxn];
vector<int > g[maxn];
long long ans=0;
long long max_=-1;
void dfs(int num,int fa){
long long sum1=0,sum2=0;
long long zd=0,cd=0;
for(int i=0;i<g[num].size();i++){
if(g[num][i]!=fa){
if(v[g[num][i]]>zd) zd=v[g[num][i]];
else cd=max(cd,v[g[num][i]]);
dfs(g[num][i],num);
ans=(ans+2*v[fa]*v[g[num][i]])%mod;
max_=max(v[fa]*v[g[num][i]],max_);
sum1=(sum1+v[g[num][i]])%mod;
sum2=(sum2+v[g[num][i]]*v[g[num][i]])%mod;
}
}
ans=(ans+(sum1*sum1)-sum2)%mod;
max_=max(zd*cd,max_);
}
int main(){
cin>>n;
for(int i=1;i<=n-1;i++){
int x,y;
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
for(int i=1;i<=n;i++) cin>>v[i];
dfs(1,0);
cout<<max_<<" "<<ans<<endl;
return 0;
}
```cpp