#include #include #include #include #include #include #include #include #include using namespace std; typedef unsigned int uint; typedef long long LL; typedef vector VI; typedef vector VL; typedef vector VVI; typedef vector VVVI; typedef vector VVL; typedef pair PII; typedef pair PLL; typedef vector VPII; typedef vector VVPII; #define FOR(k,a,b) for(int k(a); k < (b); ++k) #define REP(k,a) for(int k=0; k < (a); ++k) #define ABS(a) ((a)>0?(a):-(a)) vector p;//parent vector si;//component size int get(int v) { int u = v; while (p[u] != u) { u = p[u]; } while (p[v] != v) { int tmp = p[v]; p[v] = u; v = tmp; } return u; } void combine(int u, int v) { int a = get(u); int b = get(v); p[a] = b; si[b] += si[a] + 1; } LL calc(int z) { return LL(z)*(z + 1) / 2; } int main(int argc, char** argv) { #ifdef HOME freopen("in.txt", "rb", stdin); freopen("out.txt", "wb", stdout); #endif int N; scanf("%d", &N); vector > > edges(N-1); vector weight(N-1); p.resize(N); si.resize(N); LL sumsave = 0, sum = 0; REP(i, N) p[i] = i; REP(i, N-1) { scanf("%d %d %d", &edges[i].second.first, &edges[i].second.second, &edges[i].first); sum += edges[i].first; --edges[i].second.first, --edges[i].second.second; } sort(edges.begin(), edges.end()); REP(i, edges.size()) { int u = get(edges[i].second.first); int v = get(edges[i].second.second); int weight = edges[i].first; LL ss = si[u] + si[v] + 1; sumsave += (calc(ss)-calc(si[u])-calc(si[v])) * weight; combine(u, v); } long double res = sumsave; res /= calc(N-1); res = sum - res; printf("%Lf\n",res); return 0; }