func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 200005;   template <typename T>   inline void read(T &AKNOI) {     T x = 0, flag = 1;     char ch = getchar();     while (!isdigit(ch)) {       if (ch ==  - ) flag = -1;       ch = getchar();     }     while (isdigit(ch)) {       x = x * 10 + ch -  0 ;       ch = getchar();     }     AKNOI = flag * x;   }   template <typename T>   inline void cmin(T &x, T y) {     if (x > y) x = y;   }   template <typename T>   inline void cmax(T &x, T y) {     if (x < y) x = y;   }   int n, cnt[MAXN], pos;   int vis[MAXN], siz[MAXN], son[MAXN], tsiz, root;   long long dis[MAXN];   double sum[MAXN], sq, cur, ans;   struct Edge {     int v, w, nxt;   } e[MAXN << 1];   int first[MAXN], eCnt;   inline void AddEdge(int u, int v, int w) {     e[++eCnt].v = v;     e[eCnt].w = w;     e[eCnt].nxt = first[u];     first[u] = eCnt;   }   void GetRoot(int u, int fa) {     siz[u] = 1;     son[u] = 0;     for (int i = first[u]; i; i = e[i].nxt) {       int v = e[i].v;       if (v == fa || vis[v]) continue;       GetRoot(v, u);       cmax(son[u], siz[v]);       siz[u] += siz[v];     }     cmax(son[u], tsiz - siz[u]);     if (son[u] < son[root]) root = u;   }   void GetCost(int u, int fa) {     sq = sqrt(dis[u]) * cnt[u];     sum[u] = sq;     cur += sq * dis[u];     for (int i = first[u]; i; i = e[i].nxt) {       int v = e[i].v;       if (v == fa) continue;       dis[v] = dis[u] + e[i].w;       GetCost(v, u);       sum[u] += sum[v];     }   }   void PointDC(int u) {     vis[u] = 1;     cur = dis[u] = 0;     GetCost(u, 0);     if (cur < ans) {       ans = cur;       pos = u;     }     for (int i = first[u]; i; i = e[i].nxt) {       int v = e[i].v;       if (vis[v]) continue;       if (sum[u] < sum[v] * 2) {         tsiz = siz[v];         root = 0;         GetRoot(v, 0);         PointDC(root);         break;       }     }   }   void init() {     read(n);     for (int i = 1; i <= n; ++i) {       read(cnt[i]);     }     for (int i = 1, u, v, w; i < n; ++i) {       read(u);       read(v);       read(w);       AddEdge(u, v, w);       AddEdge(v, u, w);     }   }   void solve() {     ans = 1e30;     son[0] = tsiz = n;     GetRoot(1, 0);     PointDC(root);     printf( %d %.8lf n , pos, ans);   }   int main() {     init();     solve();     return 0;   }   