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;
long long w[200005];
long long rail[200005][3];
vector<vector<long long> > adj;
map<long long, map<long long, long long> > dist;
map<long long, map<long long, bool> > marked;
long long n;
int flag[200005];
class Graph {
  int v;
  int **edges;
  int *parent;

 public:
  Graph(int n) {
    v = n;
    edges = new int *[n];
    parent = new int[n];
    for (int i = 0; i < n; i++) edges[i] = new int[n];
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) edges[i][j] = 0;
    for (int i = 0; i < n; i++) {
      vector<long long> temp = adj[i];
      int len = temp.size();
      for (int j = 0; j < len; j++) {
        edges[i][temp[j]] = 1;
        edges[temp[j]][i] = 1;
      }
    }
  }
  void DFS(int start) {
    bool *visited = new bool[v];
    for (int i = 0; i < v; i++) visited[i] = false;
    parent[start] = start;
    DFSUtil(visited, start);
  }
  void DFSUtil(bool *visited, int start) {
    for (int i = 0; i < v; i++) {
      if (edges[start][i] == 1) {
        if (!visited[i]) {
          visited[i] = true;
          parent[i] = start;
        }
      }
    }
  }
};
long long findLength(long long x, long long y) {
  flag[x] = 1;
  long long len, i;
  if (x == y) return 0;
  if (marked[x][y] || marked[y][x]) {
    return dist[x][y];
  }
  long long returnValue = INT_MAX;
  len = adj[x].size();
  for (i = 0; i < len; i++) {
    if (flag[adj[x][i]] != 1)
      returnValue =
          min(returnValue, findLength(x, adj[x][i]) + findLength(adj[x][i], y));
  }
  return returnValue;
}
int main() {
  scanf("%lld", &n);
  long long i;
  for (i = 0; i < n; i++) {
    scanf("%lld", &w[i]);
    vector<long long> temp;
    adj.push_back(temp);
  }
  for (i = 0; i < n - 1; i++) {
    long long p, q, r;
    scanf("%lld %lld %lld", &p, &q, &r);
    rail[i][0] = p - 1;
    rail[i][1] = q - 1;
    rail[i][2] = r;
    dist[p - 1][q - 1] = dist[q - 1][p - 1] = r;
    marked[p - 1][q - 1] = marked[q - 1][p - 1] = true;
    adj[p - 1].push_back(q - 1);
    adj[q - 1].push_back(p - 1);
  }
  long long optimalCity = 0;
  double minCost = INT_MAX;
  for (i = 0; i < n; i++) {
    double cost = 0;
    long long j;
    for (j = 0; j < n; ++j) {
      if (j != i) {
        for (long long k = 0; k < n; k++) flag[k] = 0;
        long long len = findLength(i, j);
        cost += (w[j] * pow(len, 1.5));
      }
    }
    if (cost < minCost) {
      optimalCity = i;
      minCost = cost;
    }
  }
  printf("%lld %lf", optimalCity + 1, minCost);
  cout << endl;
  return 0;
}
