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 <cstdio>
#include <cmath>
#define ri register int
typedef long double ld;
#define rd register ld
namespace io {
    const int SIZE = (1 << 21) + 1;
    char ibuf[SIZE], *iS, *iT, c;
    // getchar
    #define gc() (iS == iT ? (iT = (iS = ibuf) + fread (ibuf, 1, SIZE, stdin), (iS == iT ? EOF : *iS ++)) : *iS ++)
    // input a signed integer
    template <class I>
    inline void gi (I &x) {
        for (c = gc(); c < '0' || c > '9'; c = gc()) ;
        for (x = 0; c <= '9' && c >= '0'; c = gc()) x = (x << 1) + (x << 3) + (c & 15);
    }
}
using io :: gi;
const int N=2e5+5;
int cost[N],tot,head[N],nxt[N<<1],adj[N<<1],w[N],vis[N],mx[N],q[N],sz[N],f[N],point;
ld now,all,dao[N],ans;
inline void addedge(ri x,ri y,ri z){
	nxt[++tot]=head[x];
	adj[head[x]=tot]=y;
	w[tot]=z;
}
inline void dfs(ri rt,ri x,ri fa,ri d){
	rd v=(ld)3/2*sqrt(d)*cost[x];
	all+=v;
	dao[rt]+=v;
	for(ri y,i=head[x];i;i=nxt[i])
		if((y=adj[i])!=fa&&!vis[y])
			dfs(rt,y,x,d+w[i]);
}
inline int max(ri x,ri y){
	return x>y ? x:y;
}
inline int getroot(ri x){
	ri l,r,i,y,rt;
	q[l=r=1]=x;
	f[x]=0;
	while(l<=r){
		x=q[l++];
		sz[x]=1;
		mx[x]=0;
		for(i=head[x];i;i=nxt[i])
			if((y=adj[i])!=f[x]&&!vis[y])
				f[y]=x,q[++r]=y;
	}
	rt=q[r];
	for(l=r;l;--l){
		x=q[l];
		sz[f[x]]+=sz[x];
		mx[f[x]]=max(mx[f[x]],sz[x]);
		mx[x]=max(mx[x],r-sz[x]);
		if(mx[x]<mx[rt]) rt=x;
	}
	return rt;
}
inline void calc(ri x,ri fa,ri d){
	now+=(ld)d*sqrt(d)*cost[x];
	for(ri y,i=head[x];i;i=nxt[i])
		if((y=adj[i])!=fa)
			calc(y,x,d+w[i]);
}
inline void solve(ri x){
	x=getroot(x);
	vis[x]=1;
	now=0;
	calc(x,0,0);
	if(now<ans) point=x,ans=now;
	all=0;
	ri y,i,nxtp;
	for(i=head[x];i;i=nxt[i])
		if(!vis[y=adj[i]])
			dao[y]=0,
			dfs(y,y,x,w[i]);
	now=1e18;nxtp=0;
	for(i=head[x];i;i=nxt[i])
		if(!vis[y=adj[i]]&&all-dao[y]*2<now)
			now=all-dao[y]*2,
			nxtp=y;
	if(nxtp) solve(nxtp);
}
int main(){
    ri n,i,x,y,z;
    gi(n);
    for(i=1;i<=n;++i) gi(cost[i]);
    for(i=1;i^n;++i) gi(x),gi(y),gi(z),addedge(x,y,z),addedge(y,x,z);
    ans=1e18;
    solve(1);
    printf("%d %.10Lf\n",point,ans);
	return 0;
}