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 MAX_N = 2e5 + 10;
int N, W[MAX_N], size[MAX_N], ans_p;
double ans = numeric_limits<double>::infinity();
vector<pair<int, int>> edge[MAX_N];
bool vis[MAX_N];
double price(double x) { return pow(x, 1.5); }
double price_d(double x) { return 1.5 * pow(x, 0.5); }
void get_size(int x, int y = 0) {
  size[x] = 1;
  for (auto i : edge[x]) {
    if (i.first == y || vis[i.first]) continue;
    get_size(i.first, x);
    size[x] += size[i.first];
  }
}
void get_center(int x, int n, int &c, int y = 0) {
  if (size[x] * 2 >= n && (!c || size[x] < size[c])) c = x;
  for (auto i : edge[x]) {
    if (i.first == y || vis[i.first]) continue;
    get_center(i.first, n, c, x);
  }
}
void get_cost(int x, double d, double &cost, double &cost_d, int y = 0) {
  cost += W[x] * price(d);
  cost_d += W[x] * price_d(d);
  for (auto i : edge[x]) {
    if (i.first == y) continue;
    get_cost(i.first, d + i.second, cost, cost_d, x);
  }
}
void solve(int start) {
  get_size(start);
  int center = 0;
  get_center(start, size[start], center);
  vis[center] = true;
  static double cost[MAX_N], cost_d[MAX_N];
  double cost_sum = 0, cost_d_sum = 0;
  for (auto i : edge[center]) {
    cost[i.first] = cost_d[i.first] = 0;
    get_cost(i.first, i.second, cost[i.first], cost_d[i.first], center);
    cost_sum += cost[i.first];
    cost_d_sum += cost_d[i.first];
  }
  if (cost_sum < ans) ans = cost_sum, ans_p = center;
  for (auto i : edge[center]) {
    if (vis[i.first]) continue;
    if (cost_d[i.first] * 2 > cost_d_sum) {
      solve(i.first);
      return;
    }
  }
}
int main() {
  scanf("%d", &N);
  for (int i = 1; i <= N; i++) scanf("%d", &W[i]);
  for (int i = 1; i < N; i++) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    edge[u].emplace_back(v, w);
    edge[v].emplace_back(u, w);
  }
  solve(1);
  printf("%d %.10lf\n", ans_p, ans);
}
