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> 
#define rg register 
#define fp( i , x , y ) for( rg int i=(x); i<=(y); ++i ) 
#define fq( i , x , y ) for( rg int i=(y); i>=(x); --i ) 
#define i60 long long 
#define dou double 
using namespace std ; 
const int N = 2e5+10 ; 
vector <int> v[N] , edge[N] ; 
i60 d[N] , val[N] ; dou nw_ans , ans[N] ; 
int sz[N] , mx[N] , rt , n ; bool vis[N] ; 
void add( int x , int y , int z ) { 
  v[x].push_back(y) ; edge[x].push_back(z) ;  
} 
void findrt1( int x , int fa ) { 
  int l = v[x].size() , y ; 
  sz[x] = 1 ; 
  fp( i , 0 , l-1 ) { 
    y = v[x][i] ; 
    if( y == fa || vis[y] ) continue ; 
    findrt1( y , x ) ; 
    sz[x] += sz[y] ; 
  } 
} 
void findrt2( int x , int fa ) { 
  int l = v[x].size() , y ; 
  mx[x] = 0 ; 
  fp( i , 0 , l-1 ) { 
    y = v[x][i] ; 
    if( y == fa || vis[y] ) continue ; 
	findrt2( y , x ) ; 
	mx[x] = max( mx[x] , sz[y] ) ; 
  } 
  mx[x] = max( mx[x] , n-sz[x] ) ; 
  if( !rt || mx[rt] > mx[x] ) rt = x ; 
} 
void calc( int x , int fa , int opt ) { 
  if( opt == 0 ) nw_ans += 1.0 * val[x] * d[x] * sqrt(d[x]) ; 
  else nw_ans += 1.0 * opt * val[x] * sqrt(d[x]) ; 
  int l = v[x].size() , y , z ;  
  fp( i , 0 , l-1 ) { 
    y = v[x][i] ; z = edge[x][i] ; 
    if( y == fa ) continue ; 
    d[y] = d[x] + z ; calc( y , x , opt ) ;  
  } 
} 
void dfs( int x ) { 
  vis[x] = 1 ; 
  int l = v[x].size() , y , z ;  
  nw_ans = 0 ; d[x] = 0 ; calc( x , 0 , 0 ) ; 
  ans[x] = nw_ans ;  
  nw_ans = 0 ; calc( x , 0 , 1 ) ; 
  fp( i , 0 , l-1 ) { 
    y = v[x][i] ; z = edge[x][i] ;  
    if( vis[y] ) continue ; 
    nw_ans = 0 ; 
	d[y] = z ; calc( y , x , -2 ) ; 
	if( nw_ans < 0 ) { 
	  findrt1( y , x ) ; 
	  rt = 0 ; findrt2( y , x ) ; 
	  dfs( rt ) ; return ; 
	}   
  } 
} 
signed main() { 
  ios::sync_with_stdio(false) ; 
  cin.tie(0) ; 
  int x , y , z ; 
  cin >> n ; 
  fp( i , 1 , n ) cin >> val[i] , ans[i] = -1.0 ;  
  fp( i , 1 , n-1 ) { 
    cin >> x >> y >> z ; 
    add( x , y , z ) ; add( y , x , z ) ; 
  } 
  findrt1( 1 , 0 ) ; 
  findrt2( 1 , 0 ) ; dfs( rt ) ; 
  int p = 1 ; 
  fp( i , 1 , n ) 
    if( ans[i] != -1.0 && ( ans[p] == -1.0 || ans[p] > ans[i] ) ) p = i ; 
  cout << p << ' ' << fixed << setprecision(10) << ans[p] << '\n' ;  
  return 0 ; 
} 
