#include <bits/stdc++.h>   #pragma GCC optimize( O3 )   #pragma GCC optimize( Ofast,no-stack-protector )   using namespace std;   void err(istream_iterator<string> it) {}   template <typename T, typename... Args>   void err(istream_iterator<string> it, T a, Args... args) {     cerr << *it <<   =   << a <<   n ;     err(++it, args...);   }   function<void(void)> ____ = []() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);   };   template <typename T>   vector<T> &operator<<(vector<T> &__container, T x) {     __container.push_back(x);     return __container;   }   template <typename T>   ostream &operator<<(ostream &out, vector<T> &__container) {     for (T _ : __container) out << _ <<    ;     return out;   }   void sci() {}   template <typename... Args>   void sci(int &x, Args &...args) {     scanf( %d , &x);     sci(args...);   }   void scl() {}   template <typename... Args>   void scl(long long int &x, Args &...args) {     scanf( %lld , &x);     scl(args...);   }   const int MAXN = 2e5 + 7;   double ret;   int rt;   int n, w[MAXN], root, sz[MAXN], maxsz[MAXN];   double derivative[MAXN];   bool vis[MAXN];   vector<pair<int, int> > G[MAXN];   void findroot(int u, int par, int tot) {     sz[u] = 1;     maxsz[u] = 0;     for (auto &e : G[u]) {       int v = e.first, c = e.second;       if (vis[v] or v == par) continue;       findroot(v, u, tot);       sz[u] += sz[v];       ((maxsz[u]) = (maxsz[u]) > (sz[v]) ? (maxsz[u]) : (sz[v]));     }     ((maxsz[u]) = (maxsz[u]) > (tot - sz[u]) ? (maxsz[u]) : (tot - sz[u]));     if (maxsz[u] < maxsz[root]) root = u;   }   double cost;   void dfs(int u, int par, int wt) {     cost += pow(wt, 1.5) * w[u];     derivative[u] = w[u] * 1.5 * pow(wt, 0.5);     for (auto &e : G[u]) {       int v = e.first, c = e.second;       if (v == par) continue;       dfs(v, u, wt + c);       derivative[u] += derivative[v];     }   }   void divide(int u) {     if (vis[u]) return;     vis[u] = true;     cost = 0;     double sd = 0;     for (auto &e : G[u]) {       int v = e.first, c = e.second;       dfs(v, u, c);       sd += derivative[v];     }     if (cost < ret) ret = cost, rt = u;     for (auto &e : G[u]) {       int v = e.first;       if (sd - 2 * derivative[v] >= 0) continue;       root = 0;       findroot(v, u, sz[v]);       divide(root);       return;     }   }   void solve() {     sci(n);     for (int i = 1; i <= n; i++) sci(w[i]);     for (int i = 1; i < n; i++) {       int u, v, c;       sci(u, v, c);       G[u] << pair<int, int>(v, c);       G[v] << pair<int, int>(u, c);     }     ret = LLONG_MAX;     maxsz[root = 0] = 0x3f3f3f3f;     findroot(1, 0, n);     divide(root);     cout << rt <<     << fixed << setprecision(10) << ret <<   n ;   }   int main() {     solve();     return 0;   }   