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;
const int N = 2e5 + 10;
int n, a[N], ans1, siz[N], mxx[N], rt;
long double ans2;
bool vis[N];
vector<pair<int, int> > e1[N];
void find_rt(int x, int fa, int tot) {
  siz[x] = 1;
  mxx[x] = 1;
  int siz1 = e1[x].size();
  for (int i = 0; i < siz1; i++) {
    int y = e1[x][i].first;
    if (!vis[y] && y != fa) {
      find_rt(y, x, tot);
      mxx[x] = max(mxx[x], siz[y]);
      siz[x] += siz[y];
    }
  }
  mxx[x] = max(mxx[x], tot - siz[x]);
  if (mxx[rt] > mxx[x]) rt = x;
  return;
}
long double sum;
void dfs(int x, int fa, long long len) {
  sum += (long double)a[x] * (long double)sqrt((long double)len) *
         (long double)len;
  int siz1 = e1[x].size();
  for (int i = 0; i < siz1; i++) {
    int y = e1[x][i].first, v = e1[x][i].second;
    if (y != fa) dfs(y, x, len + v);
  }
  return;
}
void calc(int x) {
  sum = 0;
  dfs(x, 0, 0);
  if (ans2 > sum) ans1 = x, ans2 = sum;
  return;
}
long double cnt[N];
void dfs2(int x, int fa, long long len, int id) {
  cnt[id] += (long double)1.5 * sqrt((long double)len) * (long double)a[x];
  int siz1 = e1[x].size();
  for (int i = 0; i < siz1; i++) {
    int y = e1[x][i].first, v = e1[x][i].second;
    if (y != fa) dfs2(y, x, len + v, id);
  }
  return;
}
int getnxt(int x) {
  int aim = -1, siz1 = e1[x].size();
  for (int i = 0; i < siz1; i++) {
    int y = e1[x][i].first, v = e1[x][i].second;
    cnt[i] = 0;
    dfs2(y, x, v, i);
  }
  long double sum = 0;
  for (int i = 0; i < siz1; i++) sum += cnt[i];
  for (int i = 0; i < siz1; i++)
    if ((sum - (long double)2.0 * cnt[i]) < 0 && !vis[e1[x][i].first])
      aim = e1[x][i].first;
  return aim;
}
void solve(int x, int dep) {
  vis[x] = 1;
  calc(x);
  int aim = getnxt(x);
  if (aim == -1) return;
  rt = 0;
  find_rt(aim, x, siz[aim]);
  solve(rt, dep + 1);
  return;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= n - 1; i++) {
    int x, y, l;
    scanf("%d%d%d", &x, &y, &l);
    e1[x].push_back(make_pair(y, l));
    e1[y].push_back(make_pair(x, l));
  }
  ans2 = 1e19;
  mxx[0] = N;
  find_rt(1, 0, n);
  solve(rt, 0);
  printf("%d %.7Lf", ans1, ans2);
  return 0;
}
