#include <bits/stdc++.h>
using namespace std;
const long long int INF = 1LL << 60;
long long int tot;
int n, a, b;
vector<int> lista[100010];
char visitados[100010];
long long int A[100010];
long long int gcd(long long int a, long long int b) {
  if (!b) return a;
  return gcd(b, a % b);
}
long long int mmc(long long int a, long long int b) {
  return a / gcd(a, b) * b;
}
int dfs(int atual, long long int tot) {
  visitados[atual] = 1;
  if (atual > 1 && lista[atual].size() == 1) {
    if (tot <= A[atual]) return 1;
    return 0;
  }
  long long int div = tot;
  if (atual == 1) {
    div /= lista[1].size();
  } else {
    div /= lista[atual].size() - 1;
  }
  bool passo = true;
  for (int i = 0; i < lista[atual].size(); i++) {
    int prox = lista[atual][i];
    if (visitados[prox]) continue;
    passo = passo && dfs(prox, div);
  }
  return passo;
}
long long int dfs2(int atual) {
  visitados[atual] = 1;
  if (atual > 1 && lista[atual].size() == 1) {
    return 1;
  }
  long long int resp = 1;
  int cont = 0;
  for (int i = 0; i < lista[atual].size(); i++) {
    int prox = lista[atual][i];
    if (visitados[prox]) continue;
    resp = mmc(resp, dfs2(prox));
    cont++;
  }
  return resp * cont;
}
int main(void) {
  scanf("%d", &n);
  long long int mdc = 1;
  for (int i = 1; i <= n; i++) {
    cin >> A[i];
    tot += A[i];
  }
  for (int i = 0; i < n - 1; i++) {
    scanf("%d %d", &a, &b);
    lista[a].push_back(b);
    lista[b].push_back(a);
  }
  long long int m = dfs2(1);
  if (m == 0) {
    cout << tot << endl;
    return 0;
  }
  long long int ini = 0;
  long long int fim = tot / m;
  long long int resp = 0;
  while (fim >= ini) {
    memset(visitados, 0, sizeof visitados);
    long long int meio = (ini + fim) / 2;
    bool valor = dfs(1, meio * m);
    if (valor) {
      resp = meio;
      if (ini == meio + 1) break;
      ini = meio + 1;
    } else {
      fim = meio - 1;
    }
  }
  cout << tot - resp * m << endl;
  return 0;
}
