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>
double w[200010];
struct ele {
  int x;
  double d;
};
std::vector<ele> edge[200010];
std::vector<int> tmp;
int dp[200010], tot[200010];
bool use[200010], vi[200010];
double der[200010], di[200010];
int n;
void ini() {
  for (int k = 0; k < tmp.size(); k++) {
    int i = tmp[k];
    tot[i] = -1;
    dp[i] = 0;
  }
  tmp.clear();
  return;
}
void cent(int x) {
  tot[x] = 1;
  tmp.push_back(x);
  for (int k = 0; k < edge[x].size(); k++) {
    int i = edge[x][k].x;
    if (use[i]) continue;
    if (tot[i] == -1) {
      cent(i);
    } else
      continue;
    dp[x] = std::max(dp[x], tot[i]);
    tot[x] += tot[i];
  }
  return;
}
void dfs(int x, int y) {
  vi[x] = true;
  for (int k = 0; k < edge[x].size(); k++) {
    int i = edge[x][k].x;
    if (vi[i]) continue;
    di[i] = di[x] + edge[x][k].d;
    der[y] += sqrt(di[i]) * w[i];
    dfs(i, y);
  }
  return;
}
void dfs2(int x, int y) {
  vi[x] = true;
  for (int k = 0; k < edge[x].size(); k++) {
    int i = edge[x][k].x;
    if (vi[i]) continue;
    di[i] = di[x] + edge[x][k].d;
    der[y] += di[i] * sqrt(di[i]) * w[i];
    dfs2(i, y);
  }
  return;
}
void print() {
  double min = 1e30;
  int ans;
  for (int k = 0; k < tmp.size(); k++) {
    int i = tmp[k];
    memset(vi, false, sizeof(vi));
    di[i] = 0;
    der[k] = 0;
    dfs2(i, k);
    if (der[k] < min) {
      min = der[k];
      ans = i;
    }
  }
  printf("%d %.10f", ans, min);
  return;
}
void tru(int x) {
  ini();
  int min = 1e9, it;
  double sum = 0;
  cent(x);
  for (int k = 0; k < tmp.size(); k++) {
    int i = tmp[k];
    if (min > std::max(dp[i], tot[x] - tot[i])) {
      min = std::max(dp[i], tot[x] - tot[i]);
      it = i;
    }
  }
  use[it] = true;
  memset(vi, false, sizeof(vi));
  vi[it] = true;
  for (int k = 0; k < edge[it].size(); k++) {
    int i = edge[it][k].x;
    der[k] = 0;
    di[i] = edge[it][k].d;
    der[k] += sqrt(di[i]) * w[i];
    dfs(i, k);
    sum += der[k];
  }
  int in = -1;
  for (int k = 0; k < edge[it].size(); k++) {
    if (sum - 2 * der[k] < 1e-10) {
      in = k;
      break;
    }
  }
  if (in == -1) {
    tmp.clear();
    tmp.push_back(it);
    print();
    return;
  }
  if (use[edge[it][in].x]) {
    tmp.push_back(edge[it][in].x);
    print();
    return;
  }
  tru(edge[it][in].x);
  return;
}
int main() {
  int a, b, k;
  double d;
  scanf("%d", &n);
  for (k = 1; k <= n; k++) {
    scanf("%lf", &w[k]);
  }
  for (k = 1; k < n; k++) {
    scanf("%d%d%lf", &a, &b, &d);
    edge[a].push_back(ele{b, d});
    edge[b].push_back(ele{a, d});
  }
  memset(tot, -1, sizeof(tot));
  tru(1);
}
