rt,本人已调3d已疯。
#include <bits/stdc++.h>
using namespace std;
//#define int long long
const int N = 1e5 + 10;
int n , m , son[N] , fa[N] , cnt , head[N];
double up[N] , down[N] , ans;
struct edge{
int to , ne , w;
edge(){}
edge(int to , int ne , int w): to(to) , ne(ne) , w(w){}
}e[N << 1];
void add(int x , int y , int z){
e[++cnt] = edge(y , head[x] , z);
head[x] = cnt;
}
#define v e[i].to
int pos;
bool vis[N] , flag;
void dfs1(int u , int k){
vis[u] = true;
for(int i = head[u];;i = e[i].ne){
if(v != k){
if(vis[v]){
pos = v;
return;
}
dfs1(v , u);
if(!flag && pos == u){
flag = true;
return;
}
if(flag) break;
}
}
vis[u] = false;
}
int t , disl[22] , disr[22] , dfn[N] , path[22];
int dfs2(int u , int k){
dfn[u] = ++t , path[t] = u;
fa[u] = 2;
for(int i = head[u];;i = e[i].ne){
if(v != k && vis[v]){
if(!dfn[v]) dfs2(v , u);
disr[dfn[u]] = disl[dfn[v]] = e[i].w;
break;
}
}
}
void dfs_down(int u , int k){
for(int i = head[u];;i = e[i].ne){
if(v != k && !vis[v]){
fa[v] = 1;
dfs_down(v , u);
son[u]++;
down[u] += down[v] + e[i].w;
}
}
if(son[u]) down[u] /= son[u];
}
void dfs_up(int u , int k , int w){
up[u] = w;
if(fa[k] + son[k] - 1)
up[k] += (up[k] * fa[k] + down[k] * son[k] - down[u] - w) / (fa[k] + son[k] - 1);
for(int i = head[u];;i = e[i].to){
if(v != k) dfs_up(v , u , e[i].w);
}
}
void solve(){
dfs_down(1 , 0);
for(int i = head[1];;i = e[i].ne)
dfs_up(v , 1 , e[i].w);
}
#define nxt(x) (x==t?1:x+1)
#define pre(x) (x==1?t:x-1)
double tmp;
void solve1(){
dfs1(1 , 0);
dfs2(pos , 0);
for(int i = 1;i <= t;i++)
dfs_down(path[i] , 0);
for(int i = 1;i <= t;i++){
int x = path[i];
tmp = 0.5;
for(int j = nxt(i);j != i;j = nxt(j)){
int y = path[j];
if(nxt(j) == i) up[x] += tmp * (disl[j] + down[y]);
else up[x] += tmp * (down[y] * son[y] / (son[y] + 1) + disl[j]);
tmp /= (son[y] + 1);
}
tmp = 0.5;
for(int j = pre(i);j != i;j = pre(j)){
int y = path[j];
if(pre(j) == i) up[x] += tmp * (disr[j] + down[y]);
else up[x] += tmp * (down[y] * son[y] / (son[y] + 1) + disr[j]);
tmp /= (son[y] + 1);
}
for(int j = head[x];;j = e[j].ne){
if(!vis[e[j].to])
dfs_up(e[j].to , x , e[j].w);
}
}
}
#undef v
signed main()
{
cin >> n >> m;
for(int i = 1;i <= m;i++){
int u , v , w;
cin >> u >> v >> w;
add(u , v , w);
add(v , u , w);
}
if(n != m) solve();
else solve1();
for(int i = 1;i <= n;i++)
ans += (down[i] * son[i] + up[i] * fa[i]) / (son[i] + fa[i]);
printf("%.5lf\n", ans / n);
return 0;
}