

1 #include <bits/stdc++.h> 2 using namespace std; 3 #define rep(i,a,b) for(int i=a;i<=b;++i) 4 #define fd(i,a,b) for(int i=a;i>=b;--i) 5 const double eps = 1e-8; 6 const int maxn=110; 7 double v[maxn][maxn]; 8 inline void guess(int n) { 9 rep(i,1,n) { 10 fd(k,n+1,i) v[i][k] /= v[i][i]; 11 rep(k,i+1,n) { 12 double bs=v[k][i]; 13 rep(j,i,n+1) v[k][j]-=v[i][j]*bs; 14 } 15 } 16 fd(i,n,1) rep(k,i+1,n) 17 v[i][n+1]-=v[i][k]*v[k][n+1]; 18 } 19 struct Edge { 20 int v,w;Edge *to; 21 Edge(int v,int w,Edge *to):v(v),w(w),to(to){} 22 Edge() {} 23 }*head[maxn],pool[200000],*pis=pool; 24 int n,m,op[maxn]; 25 void build(int l) { 26 memset(v,0,sizeof(v)); rep(i,1,n) v[i][i]=1; 27 rep(i,1,n-1) { 28 for(Edge *now=head[i];now;now=now->to) 29 if(now->w&(1<<l)) v[i][now->v]+=1.0/op[i],v[i][n+1]+=1.0/op[i]; 30 else v[i][now->v]-=1.0/op[i]; 31 } 32 } 33 inline int gi() { 34 int x=0;char o;bool f=true;for(;!isdigit(o=getchar());)if(o=='-')f=false; 35 for(;isdigit(o);o=getchar())x=(x<<1)+(x<<3)+(o&15);return f?x:~x+1; 36 } 37 int main() { 38 n=gi();m=gi(); 39 rep(i,1,m) { 40 int u=gi(),v=gi(),w=gi(); 41 head[u]=new(pis++)Edge(v,w,head[u]),++op[u]; 42 if(u^v) head[v]=new(pis++)Edge(u,w,head[v]),++op[v]; 43 } 44 double ans=0.0; 45 rep(i,0,30) { 46 build(i); guess(n); 47 ans+=v[1][n+1]*(1<<i); 48 } 49 printf("%.3lf\n",ans); 50 }