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 MAXN = 202020;
const double INF = 1E30;
int N;
int w[MAXN];
vector<pair<int, int> > edge[MAXN];
bool vis[MAXN];
double ans[MAXN];
double s3[MAXN], s1[MAXN];
int wei[MAXN];
void dfsw(int v, int p) {
  if (vis[v]) return;
  wei[v] = 1;
  for (auto ch : edge[v]) {
    if (vis[ch.first]) continue;
    if (ch.first == p) continue;
    dfsw(ch.first, v);
    wei[v] += wei[ch.first];
  }
}
void dfs(int v, int p, int d) {
  double sqd = sqrt(d);
  s3[v] = w[v] * sqd * d;
  s1[v] = w[v] * sqd;
  for (auto ch : edge[v]) {
    if (ch.first == p) continue;
    dfs(ch.first, v, d + ch.second);
    s3[v] += s3[ch.first];
    s1[v] += s1[ch.first];
  }
}
void dfs2(int v, int p, vector<int> &vec) {
  if (vis[v]) return;
  vec.push_back(v);
  for (auto ch : edge[v]) {
    if (ch.first == p) continue;
    dfs2(ch.first, v, vec);
  }
}
void calc() {
  for (int i = 0; i < N; i++) ans[i] = INF;
  vector<int> vec;
  for (int i = 0; i < N; i++) vec.push_back(i);
  while (!vec.empty()) {
    for (auto x : vec) vis[x] = false;
    dfsw(vec[0], -1);
    int vs = vec.size();
    int vs2 = vec.size() / 2 + 1;
    int v = -1;
    for (auto x : vec) {
      bool ok = true;
      if (vs - wei[x] > vs2) ok = false;
      for (auto ch : edge[x]) {
        if (vis[ch.first] || wei[ch.first] > wei[x]) continue;
        if (wei[ch.first] > vs2) ok = false;
      }
      if (ok) v = x;
    }
    dfs(v, -1, 0);
    ans[v] = s3[v];
    int bestch = -1;
    double bestgrad = -INF;
    for (auto ch : edge[v]) {
      if (vis[ch.first]) continue;
      double grad = s1[ch.first];
      if (grad > bestgrad) {
        bestgrad = grad;
        bestch = ch.first;
      }
    }
    if (bestch == -1) break;
    vis[v] = true;
    vector<int> nvec;
    dfs2(bestch, v, nvec);
    for (auto x : vec) vis[x] = true;
    vec = nvec;
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> N;
  for (int i = 0; i < N; i++) cin >> w[i];
  for (int i = 0; i < N - 1; i++) {
    int a, b, l;
    cin >> a >> b >> l;
    a--;
    b--;
    edge[a].push_back(make_pair(b, l));
    edge[b].push_back(make_pair(a, l));
  }
  calc();
  int bst = -1;
  double bstval = 1E20;
  for (int i = 0; i < N; i++) {
    if (ans[i] < bstval) {
      bstval = ans[i];
      bst = i;
    }
  }
  cout << bst + 1 << " " << fixed << setprecision(10) << bstval << endl;
  return 0;
}
