#include <iostream>
#include <cstdio>
using namespace std;

const int INF = 1000000000;

const int M = 10007;

const int MaxN = 200000;

template <class T>
inline void tension(T &a, const T &b)
{
	if (b < a)
		a = b;
}
template <class T>
inline void relax(T &a, const T &b)
{
	if (b > a)
		a = b;
}

struct halfEdge
{
	int u;
	halfEdge *next;
};
halfEdge adj_pool[(MaxN - 1) * 2], *adj_tail = adj_pool;

int n;
int wei[MaxN + 1];
halfEdge *adj[MaxN + 1];

inline void addEdge(int v, int u)
{
	adj_tail->u = u, adj_tail->next = adj[v], adj[v] = adj_tail++;
}

int main()
{
	//freopen("link.in", "r", stdin);
	//freopen("link.out", "w", stdout);

	cin >> n;
	for (int i = 0; i < n - 1; i++)
	{
		int v, u;
		scanf("%d %d", &v, &u);
		addEdge(v, u), addEdge(u, v);
	}
	for (int v = 1; v <= n; v++)
		scanf("%d", &wei[v]);

	int maxW = 0, sumW = 0;
	for (int v = 1; v <= n; v++)
	{
		int cur = 0;
		int fst = -1, snd = -1;
		for (halfEdge *e = adj[v]; e; e = e->next)
		{
			if (wei[e->u] > fst)
				snd = fst, fst = wei[e->u];
			else if (wei[e->u] > snd)
				snd = wei[e->u];
			cur = (cur + wei[e->u]) % M;

			sumW = (sumW + M - wei[e->u] * wei[e->u] % M) % M;
		}

		if (fst != -1 && snd != -1)
			relax(maxW, fst * snd);
		sumW = (sumW + cur * cur) % M;
	}

	cout << maxW << " " << sumW << endl;

	return 0;
}
/**************************************************************
	Problem: 2335
	User: admin
	Language: C++
	Result: Accepted
	Time:341 ms
	Memory:10668 kb
****************************************************************/