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
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<vector>
#include<algorithm>

using namespace std;

const int MX = 200005;

typedef pair<int, int> pii;
typedef pair<double, int> pdi;
typedef long long ll;

vector<int> G[MX], L[MX], R[MX];

int cnt[MX], chk[MX], t, W[MX];
double sum[MX];

int get_cnt(int x)
{
    if (chk[x] == t) return 0;
    chk[x] = t; cnt[x] = 1;
    for (int c : R[x]) cnt[x] += get_cnt(c);
    return cnt[x];
}

double get_sum(int x, double d)
{
    if (chk[x] == t) return 0;
    chk[x] = t;
    sum[x] = sqrt(d) * d * W[x];
    for (int i = 0; i < G[x].size(); i++){
        int c = G[x][i], l = L[x][i];
        sum[x] += get_sum(c, d + l);
    }
    return sum[x];
}

pdi dfs(int x)
{
    t++; get_cnt(x);
    while (true){
        int H = -1;
        for (int c : R[x]){
            if (cnt[x] < cnt[c] * 2) H = c;
        }
        if (H == -1) break;
        else cnt[x] -= cnt[H], cnt[H] += cnt[x], x = H;
    }
    t++; get_sum(x, 0);

    int ad = 0, m;
    t++; pdi tmp = pdi(get_sum(x, 0), x);
    if (R[x].empty()) return tmp;
    for (int i = 0; i < R[x].size(); i++){
        if (sum[R[x][i]] > sum[R[x][ad]]) ad = i;
    }
    m = R[x][ad];
    if (sum[x] > sum[m] * 2) return tmp;
    else{
        for (int i = 0; i < R[m].size(); i++){
            if (R[m][i] == x) R[m][i] = R[m].back(), R[m].pop_back();
        }
        return min(dfs(m), tmp);
    }
}

int gen()
{
    freopen("input.txt", "w", stdout);
    int N = 1000;
    printf("%d\n", N);
    for (int i = 1; i <= N; i++) printf("%d ", 1);
    printf("\n");
    for (int i = 2; i <= N; i++){
        printf("%d %d %d\n", i, rand() % (i - 1) + 1, 1);
    }
    return 0;
}

int main()
{
//  return gen();
    int N;
    scanf("%d", &N);
    for (int i = 1; i <= N; i++) scanf("%d", W + i);
    for (int i = 1; i < N; i++){
        int A, B, C;
        scanf("%d%d%d", &A, &B, &C);
        G[A].push_back(B);
        G[B].push_back(A);
        R[A].push_back(B);
        R[B].push_back(A);
        L[A].push_back(C);
        L[B].push_back(C);
    }

    pdi t = dfs(1);
    printf("%d %.10lf\n", t.second, t.first);
    return 0;
}