#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 10;
struct Edge {
  int to, w;
  Edge(int to, int w) : to(to), w(w) {}
};
vector<Edge> g[MAXN];
int sz[MAXN], cost[MAXN];
bitset<MAXN> used;
void getSize(int v, int p = -1) {
  sz[v] = 1;
  for (auto &e : g[v]) {
    int u = e.to;
    if (u != p && !used[u]) {
      getSize(u, v);
      sz[v] += sz[u];
    }
  }
}
int findCentroid(int v, int p, int n) {
  for (auto &e : g[v]) {
    int u = e.to;
    if (u != p && !used[u] && sz[u] > n / 2) {
      return findCentroid(u, v, n);
    }
  }
  return v;
}
double calcPepega(int v, int p, int d) {
  double pepega = 1. * cost[v] * sqrt(d);
  for (auto &e : g[v]) {
    int u = e.to;
    if (u != p) {
      pepega += calcPepega(u, v, d + e.w);
    }
  }
  return pepega;
}
double calcDist(int v, int p = -1, int d = 0) {
  double ans = 1. * cost[v] * sqrt(1LL * d * d * d);
  for (auto &e : g[v]) {
    if (e.to != p) {
      ans += calcDist(e.to, v, d + e.w);
    }
  }
  return ans;
}
int getAns(int v) {
  getSize(v);
  used[v] = true;
  double omegapepega = 0;
  int id = -1;
  for (int i = 0; i < g[v].size(); i++) {
    int u = g[v][i].to, w = g[v][i].w;
    if (!used[u]) {
      double d = calcPepega(u, v, w);
      if (d > omegapepega) {
        omegapepega = d;
        id = i;
      }
    }
  }
  if (id == -1) {
    return v;
  }
  int u = g[v][id].to;
  if (calcDist(v) <= calcDist(u)) {
    return v;
  }
  return getAns(findCentroid(u, v, sz[u]));
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  cout << fixed << setprecision(10);
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> cost[i];
  }
  for (int i = 0; i < n - 1; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    u--, v--;
    g[u].push_back(Edge(v, w));
    g[v].push_back(Edge(u, w));
  }
  getSize(0);
  int v = getAns(findCentroid(0, -1, n));
  cout << v + 1 << " " << calcDist(v);
}
