const m=10007;
type edge=record
            v,next:longint;
          end;
var i,j,k,n,p,end_,max1,max2,sum,tot,max0:longint;
    w:array[1..200000]of longint;
    e:array[1..400000]of edge;
    d:array[1..200000]of longint;
    first:array[1..200000]of longint;
function max(a,b:longint):longint;begin if a>b then exit(a);exit(b);end;
procedure add(x,y:longint);
begin
  inc(end_);
  e[end_].v:=y;
  e[end_].next:=first[x];
  first[x]:=end_;
end;
procedure init;
var u,v:longint;
begin
  readln(n);
  end_:=0;
  for i:=1 to n do first[i]:=-1;
  for i:=1 to n-1 do
    begin
      readln(u,v);
      add(u,v);
      add(v,u);
    end;
  for i:=1 to n do
    begin
      read(w[i]);
    end;
end;
begin
  init;
  max0:=-1;
  for i:=1 to n do
    begin
      j:=first[i];
      max1:=-1;max2:=-1;sum:=0;p:=0;
      while j<>-1 do
        begin
          inc(p);d[p]:=w[e[j].v];
          sum:=(sum+d[p])mod m;
          tot:=(tot-d[p]*d[p]+m)mod m;
          if d[p]>max1 then begin max2:=max1;max1:=d[p]; end
          else if d[p]>max2 then max2:=d[p];
          j:=e[j].next;
        end;
      if p>0 then begin tot:=(tot+sum*sum)mod m; end;
      if tot<0 then tot:=tot+m;
      max0:=max(max0,max1*max2);
    end;
  writeln(max0,' ',tot);
end.
/**************************************************************
	Problem: 2335
	User: admin
	Language: Pascal
	Result: Wrong Answer
****************************************************************/