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 <queue>
#include <vector>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MP make_pair
#define ll long long
#define fi first
#define se second
using namespace std;

template <typename T>
void read(T &x) {
    x = 0; bool f = 0;
    char c = getchar();
    for (;!isdigit(c);c=getchar()) if (c=='-') f=1;
    for (;isdigit(c);c=getchar()) x=x*10+(c^48);
    if (f) x=-x;
}

template<typename F>
inline void write(F x)
{
	static short st[30];short tp=0;
	if(x<0) putchar('-'),x=-x;
	do st[++tp]=x%10,x/=10; while(x);
	while(tp) putchar('0'|st[tp--]);
	putchar('\n');
}

template <typename T>
inline void Mx(T &x, T y) { x < y && (x = y); }

template <typename T>
inline void Mn(T &x, T y) { x > y && (x = y); }

const int N = 200500;
int h[N], ne[N<<1], to[N<<1], w[N<<1], tot, P, n;
double ans = 1e18;
inline void add(int x, int y, int z) {
	ne[++tot] = h[x], to[h[x] = tot] = y, w[tot] = z;
}

int siz[N], vis[N], val[N], Siz, lim, rt;
void get_rt(int x, int fa) {
	siz[x] = 1; int mx = 0;
	for (int i = h[x]; i; i = ne[i]) {
		int y = to[i]; if (y == fa || vis[y]) continue;
		siz[x] += siz[y]; Mx(mx, siz[y]);
	}
	Mx(mx, Siz - siz[x]);
	if (mx < lim) lim = mx, rt = x;
}

double d[N], sum, sumd;
void dfs(int x, int fa, int dis, int num) {
	sum += pow(dis, 1.5) * val[x], d[num] += pow(dis, 0.5) * 1.5 * val[x];
	for (int i = h[x], y; i; i = ne[i]) 
		if ((y = to[i]) != fa) dfs(y, x, dis + w[i], num);
}

void solve(int x) {
	if (vis[x]) return; 
	get_rt(x, 0), vis[x] = 1, sum = sumd = 0;
	for (int i = h[x]; i; i = ne[i]) {
		int y = to[i]; d[y] = 0;
		dfs(y, x, w[i], y), sumd += d[y];
	}
	if (sum < ans) ans = sum, P = x;
	for (int i = h[x]; i; i = ne[i]) {
		int y = to[i];
		if (sumd - d[y] * 2 >= 0) continue;
		Siz = siz[y], lim = 998224353, get_rt(y, 0);
		solve(y); break;
	}
}

int main() {
	read(n);
	for (int i = 1;i <= n; i++) read(val[i]);
	for (int i = 1, x, y, z; i < n ; i++) 
		read(x), read(y), read(z), add(x, y, z), add(y, x, z);
	Siz = n, lim = 1919810, get_rt(1, 0), solve(rt);
	printf ("%d %.8lf\n", P, ans);
	return 0;
}