#include<bits/stdc++.h>
#define maxn 2005
#define maxm 200005
using namespace std;
struct edge
{
int to,next,len;
double p;
}a[maxm];
int pre[maxn];
int n,m,tot;
int v[maxn];
int first[maxn];
int exist[maxm];
int dis[maxn];
int tt[maxn];
queue <int> que;
inline const void read(int &a)
{
a=0;
char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c<='9'&&c>='0')
{
a=(a<<1)+(a<<3)+c-'0';
c=getchar();
}
}
void add_edge(int x,int y,int z,double p)
{
a[++tot].to=y;
a[tot].len=z;
a[tot].p=p;
a[tot].next=first[x];
first[x]=tot;
}
int spfa()
{
memset(dis,-1,sizeof(dis));
dis[1]=0;
que.push(1);
v[1]=1;
while(!que.empty())
{
int x=que.front();
que.pop();
for(int i=first[x];i!=-1;i=a[i].next)
{
int vv=a[i].to;
//cout<<"vv="<<vv<<' ';
if(exist[i]&&(dis[vv]==-1||dis[x]+a[i].len<dis[vv]))
{
//cout<<"vv="<<vv<<endl;
dis[vv]=dis[x]+a[i].len;
pre[vv]=i;
if(!v[vv])
{
v[vv]=1;
que.push(vv);
}
}
}
v[x]=0;
}
//cout<<"\ndis["<<n<<"]="<<dis[n]<<endl;
if(dis[n]>dis[0])
return dis[n];
else return 0;
}
int main()
{
//freopen("in.txt","r",stdin);
int x1,x2,x3;
double y;
read(n);read(m);
memset(first,-1,sizeof(first));
memset(exist,1,sizeof(exist));
memset(pre,-1,sizeof(pre));
for(int i=1;i<=m;i++)
{
//cout<<"1"<<endl;
read(x1);read(x2);read(x3);
cin>>y;
add_edge(x1,x2,x3,y);
add_edge(x2,x1,x3,y);
}
int k=spfa();
double temp=0;
if(k==0)
{
cout<<"0.0000000"<<endl;
return 0;
}
for(int i=2;i<=n;i++)
{
//cout<<"2"<<endl;
if(pre[i]!=-1)
{
tt[++tt[0]]=pre[i];
temp+=a[pre[i]].p;
}
}
double ans=(double)k*(1-temp);
//cout<<"tt[0]="<<tt[0]<<endl;
for(int i=1;i<=tt[0];i++)
{
//cout<<"3"<<endl;
int w=1;
if(tt[i]%2==0)
w=-1;
exist[tt[i]]=0;exist[tt[i]+w]=0;
int k=spfa();
ans+=(double)k*a[tt[i]].p;
exist[tt[i]]=1;exist[tt[i]+w]=1;
}
printf("%.7f\n",ans);
return 0;
}