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;
typedef struct {
  int t;
  double w;
} edge;
vector<edge> e[200514];
int n;
double W[200514];
int vis[200514];
int sum[200514], mxs[200514], stk[200514], top;
void dfs0(int w) {
  vis[w] = 1;
  sum[w] = 1;
  mxs[w] = 0;
  stk[top++] = w;
  for (auto it : e[w]) {
    int t = it.t;
    if (vis[t]) continue;
    dfs0(t);
    sum[w] += sum[t];
    mxs[w] = max(mxs[w], sum[t]);
  }
}
double dis[200514], wei[200514], dfstmp, anstmp;
void dfs1(int w, int f, double nd) {
  dis[w] = nd;
  wei[w] = sqrt(nd);
  dfstmp += wei[w] * W[w];
  anstmp += dis[w] * wei[w] * W[w];
  for (auto it : e[w]) {
    int t = it.t;
    if (t == f) continue;
    dfs1(t, w, nd + it.w);
  }
}
int q[200514], qs, qe;
int sol(int uuu) {
  for (int i = 0; i < (n); i++) scanf("%lf", W + i);
  for (int i = 0; i < (n); i++) e[i].clear();
  for (int i = 0; i < (n - 1); i++) {
    int x, y;
    double z;
    scanf("%d %d", &(x), &(y));
    scanf("%lf", &z);
    x--, y--;
    e[x].push_back((edge){y, z});
    e[y].push_back((edge){x, z});
  }
  double ans = 1e30;
  int aaa = -1;
  for (int i = 0; i < (n); i++) vis[i] = 0;
  qs = qe = 0;
  q[qe++] = 0;
  for (; qs != qe;) {
    int w = q[qs++];
    top = 0;
    dfs0(w);
    int g = w;
    int gs = top;
    for (int i = 0; i < (top); i++) {
      int j = stk[i];
      mxs[j] = max(mxs[j], top - sum[j]);
      if (gs > mxs[j]) {
        gs = mxs[j];
        g = j;
      }
    }
    double tmp = 0, sss = 0;
    int nt = -1;
    anstmp = 0;
    for (auto it : e[g]) {
      int t = it.t;
      dfstmp = 0;
      dfs1(t, g, it.w);
      sss += dfstmp;
      if (tmp < dfstmp) {
        tmp = dfstmp;
        nt = t;
      }
    }
    if (ans > anstmp) {
      ans = anstmp;
      aaa = g;
    }
    if (nt == -1 || vis[nt] == 2) break;
    for (int i = 0; i < (top); i++) vis[stk[i]] = 0;
    vis[g] = 2;
    q[qe++] = nt;
  }
  assert(aaa != -1);
  printf("%d %.10f\n", aaa + 1, ans);
  return 1;
}
int main() {
  while (scanf("%d", &(n)) != EOF) sol(0);
  return 0;
}
