#include <bits/stdc++.h>
using namespace std;
int n;
long long a[300010];
long long best[300010];
long long bestinc[300010];
bool vis[300010];
vector<int> adj[300010];
void dfs(int x) {
  vis[x] = true;
  bestinc[x] = a[x];
  best[x] = a[x];
  for (int i = 0; i < adj[x].size(); i++) {
    int y = adj[x][i];
    if (!vis[y]) {
      dfs(y);
      best[x] = max(best[x], best[y]);
      if (bestinc[y] > 0) {
        bestinc[x] += bestinc[y];
      }
    }
  }
  best[x] = max(best[x], bestinc[x]);
}
long long ans;
long long ansc = 0;
void dfs2(int x) {
  vis[x] = true;
  bestinc[x] = a[x];
  for (int i = 0; i < adj[x].size(); i++) {
    int y = adj[x][i];
    if (!vis[y]) {
      dfs2(y);
      if (bestinc[y] > 0) {
        bestinc[x] += bestinc[y];
      }
    }
  }
  if (bestinc[x] == ans) {
    ansc++;
    bestinc[x] = 0;
  }
}
int main() {
  ios::sync_with_stdio(false);
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%I64d", &a[i]);
  }
  int u, v;
  for (int i = 0; i < n - 1; i++) {
    scanf("%d %d", &u, &v);
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  long long ma = -2000000000ll;
  for (int i = 1; i <= n; i++) {
    ma = max(ma, a[i]);
  }
  if (ma <= 0) {
    long long mac = 0;
    for (int i = 1; i <= n; i++) {
      if (a[i] == ma) {
        mac++;
      }
    }
    printf("%I64d %I64d\n", ma * mac, mac);
  } else {
    dfs(1);
    ans = best[1];
    for (int i = 1; i <= n; i++) {
      vis[i] = false;
    }
    dfs2(1);
    printf("%I64d %I64d\n", ans * ansc, ansc);
  }
}
