3
1 1 5
1 3 42
1 2 42
 2
42 23
1 2 10
 10
45792697 27183921 4791060 77070594 27286110 66957065 19283638 2944837 26775511 65379701
5 8 25
8 10 94
1 4 14
9 7 96
4 2 16
2 6 58
2 3 99
6 8 21
8 9 87
 5
3 1 2 6 5
1 2 3
2 3 1
4 3 9
5 3 1
 10
26 31 21 57 56 44 54 58 79 97
2 1 277
1 8 91
1 7 380
4 1 649
10 5 799
10 1 940
8 6 627
6 3 177
9 6 685
 10
8 100 62 38 26 51 26 23 77 32
6 8 29
4 1 82
7 8 66
7 10 67
8 9 98
6 1 14
1 5 48
3 1 58
2 9 90
 2
23 42
1 2 10
 1
42
 3
1 5 1
1 3 42
1 2 42
 10
1 1 1 1 1 1 1 1 1 1
1 2 5
1 3 5
1 4 5
1 5 5
1 6 5
1 7 5
1 8 5
1 9 5
1 10 5
 3
1 1 1
1 2 42
2 3 42
 3
5 1 1
1 3 42
1 2 24

3 1042.0638260857 1 727.3238618387 6 283959805416.40496826
 3 192.0000000000 1 13952642.4776933547 8 544327.1927847408 2 727.3238618387 1 0.0000000000 2 1042.0638260857 1 100.6230589875 2 544.3822186663 1 389.7666169867
#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
const int MAXN = 200000;
const int MAXM = MAXN - 1;
int n, m;
int w[MAXN];
int head[MAXN], nxt[2 * MAXM], to[2 * MAXM], len[MAXM];
bool dead[MAXM];
int ansidx;
double anscost;
int nid, id[MAXN];
int q[MAXN], qhead, qtail;
int par[MAXN], sz[MAXN], maxcsz[MAXN];
int d[MAXN];
int centroid(int root) {
  ++nid;
  qhead = qtail = 0;
  q[qhead++] = root, id[root] = nid, par[root] = -2, sz[root] = 1,
  maxcsz[root] = 0;
  while (qtail < qhead) {
    int at = q[qtail++];
    for (int x = head[at]; x != -1; x = nxt[x])
      if (!dead[x >> 1] && id[to[x]] != nid)
        q[qhead++] = to[x], id[to[x]] = nid, par[to[x]] = at, sz[to[x]] = 1,
        maxcsz[to[x]] = 0;
  }
  for (int i = qtail - 1; i >= 1; --i) {
    sz[par[q[i]]] += sz[q[i]];
    if (sz[q[i]] > maxcsz[par[q[i]]]) maxcsz[par[q[i]]] = sz[q[i]];
  }
  for (int i = (0); i < (qtail); ++i)
    if (2 * maxcsz[q[i]] <= sz[root] && 2 * (sz[root] - sz[q[i]]) <= sz[root])
      return q[i];
  assert(false);
}
int calcnxt(int root) {
  int ret = -1;
  double retval = 0, sumval = 0, sumcost = 0;
  ++nid;
  qhead = qtail = 0;
  id[root] = nid;
  for (int x = head[root]; x != -1; x = nxt[x]) {
    int cur = to[x];
    double curval = 0;
    q[qhead++] = cur, id[cur] = nid, d[cur] = len[x >> 1];
    while (qtail < qhead) {
      int at = q[qtail++];
      curval += 1.5 * w[at] * sqrt(1.0 * d[at]);
      sumcost += 1.0 * w[at] * d[at] * sqrt(1.0 * d[at]);
      for (int y = head[at]; y != -1; y = nxt[y])
        if (id[to[y]] != nid)
          q[qhead++] = to[y], id[to[y]] = nid, d[to[y]] = d[at] + len[y >> 1];
    }
    sumval += curval;
    if (!dead[x >> 1] && (ret == -1 || curval > retval))
      ret = cur, retval = curval;
    dead[x >> 1] = true;
  }
  if (ansidx == -1 || sumcost < anscost) ansidx = root, anscost = sumcost;
  return 2 * retval > sumval ? ret : -1;
}
void go(int at) {
  while (at != -1) {
    at = centroid(at);
    at = calcnxt(at);
  }
}
void run() {
  scanf("%d", &n);
  m = n - 1;
  for (int i = (0); i < (n); ++i) scanf("%d", &w[i]), head[i] = -1;
  for (int i = (0); i < (m); ++i) {
    int a, b;
    scanf("%d%d%d", &a, &b, &len[i]);
    --a, --b;
    dead[i] = false;
    nxt[2 * i + 0] = head[a];
    head[a] = 2 * i + 0;
    to[2 * i + 0] = b;
    nxt[2 * i + 1] = head[b];
    head[b] = 2 * i + 1;
    to[2 * i + 1] = a;
  }
  memset(id, -1, sizeof(id));
  nid = -1;
  ansidx = -1;
  anscost = 1e200;
  go(0);
  printf("%d %.9lf\n", ansidx + 1, anscost);
}
int main() {
  run();
  return 0;
}
