#include<bits/stdc++.h>
using namespace std;
int n,vis[22222],h[22222],sum[22222],T,cnt,m,t1,t2;
double dis[22222],t3,t4;
struct node{
int to,nxt;
double dis,p;
}e[11111];
void add(int t1,int t2,double t3,double t4){
cnt++;
e[cnt].to = t2;
e[cnt].dis = t3;
e[cnt].nxt = h[t1];
e[cnt].p = t4;
h[t1] = cnt;
}
bool bfs(int first,double mid){
queue<int>q;
for(int i=1;i<=n;++i)dis[i]=1e15;
memset(vis,0,sizeof vis);
memset(sum,0,sizeof sum);
dis[first] =0;
vis[first] =1;
q.push(first);
while(!q.empty()){
int x=q.front();
q.pop();
vis[x] = 0;
for(int i=h[x];i;i = e[i].nxt){
int y = e[i].to;
if(dis[y]>dis[x]+e[i].dis-e[i].p*mid){
dis[y] = dis[x]+e[i].dis-e[i].p*mid;
sum[y]=sum[x]+1;
if(sum[y]>n)return 1;
if(vis[y]==0){
vis[y] = 1;
q.push(y);
}
}
}
}
return 0;
}
bool f(double mid){
for(int i = 1;i<=n;i++)if(bfs(i,mid))return 1;
return 0;
}
int main(){
cin>>n>>m;
for(int i =0;i<m;i++){
cin>>t1>>t2>>t3>>t4;
add(t1,t2,t3,t4);
}
double l = 0,r = 1e7,mid;
while(fabs(l-r)>1e-2){
mid = (l+r)/2;
if(f(mid))r = mid;
else l = mid;
}
printf("%.1lf",l);
}