#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
struct bian
{
int v,w,nex;
}s[30000];
struct node
{
int head,fa;
double l;
}p[110];
int n,m,len=1,now;
double res[110]={},mx=1;
double a[110][110],b[110];
const double eps=1e-9;
inline int rd()
{
int s=0;char x='x';
while(x<'0'||x>'9')x=getchar();
while(x>='0'&&x<='9'){s=s*10+(x^48);x=getchar();}
return s;
}
inline void lian(int u,int v,int w)
{
p[u].l+=1;
len++;s[len].v=v;s[len].w=w;s[len].nex=p[u].head;p[u].head=len;
if(u==v)return;
p[v].l+=1;
len++;s[len].v=u;s[len].w=w;s[len].nex=p[v].head;p[v].head=len;
}
inline void readd()
{
n=rd();m=rd();
for(int i=1,u,v,w;i<=m;i++)
{
u=rd();v=rd();w=rd();
if(mx<=w)mx=w;
lian(u,v,w);
}
}
void dfs(int u)
{
if(u==n)return;
len++;a[len][u]+=p[u].l;
int v,w;
for(int i=p[u].head;i;i=s[i].nex)
{
v=s[i].v;w=s[i].w;
a[len][v]+=(((w>>now)&1)?1.00:-1.00);
b[len]+=((w>>now)&1)*1.0;
}
for(int i=p[u].head;i;i=s[i].nex)
{
v=s[i].v;
if(p[v].fa==u)
dfs(v);
}
}
inline int cmp(double x){return fabs(x)<eps?0:x<0?-1:1;}
inline void gsxy()
{
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
for(int k=i+1;k<=n;k++)
if(cmp(a[j][i]))
a[j][k]-=a[i][k]*a[j][i]/a[i][i];
if(cmp(a[j][i]))b[j]-=b[i]*a[j][i]/a[i][i];
if(cmp(a[j][i]))a[j][i]-=a[i][i]*a[j][i]/a[i][i];
}
}
for(int i=n;i>=1;i--)
{
b[i]/=a[i][i];
a[i][i]=1;
for(int j=i-1;j>=1;j--)
{
b[j]-=a[j][i]*b[i];
a[j][i]=0;
}
}
}
inline void working()
{
double xxx=1;
for(now=0;now<=32&&xxx<=mx;now++,xxx*=2)
{
len=0;
memset(a,0,sizeof(a));memset(b,0,sizeof(b));
dfs(1);
a[n][n]=1;b[n]=0;
gsxy();
res[now]=b[1];
}
}
void build(int u)
{
int v;
for(int i=p[u].head;i;i=s[i].nex)
{
v=s[i].v;
if(p[v].fa==0)
{
p[v].fa=u;
build(v);
}
}
}
inline void print()
{
double ans=0;
int x=1;
for(int i=0;i<=32&&x<=mx;i++,x*=2)
{
ans+=x*res[i];
}
printf("%.3lf",abs(ans));
}
int main()
{
readd();
p[1].fa=-1;build(1);
working();
print();
return 0;
}