#include<bits/stdc++.h>
#include<bits/extc++.h>
#define int long long
using namespace std;
using namespace __gnu_pbds;
constexpr int INF=1e18;
int n,m,ans;
vector<tuple<int,int,int> >e[1001];
gp_hash_table<int,int>dis[1001];
void dijkstra(){
std::priority_queue<tuple<int,int,int>,vector<tuple<int,int,int> >,less<tuple<int,int,int> > >q;
q.push(make_tuple(INF,0,1));
dis[1][0]=INF;
while(!q.empty()){
int d=get<0>(q.top()),c=get<1>(q.top()),u=get<2>(q.top());
q.pop();
if(dis[u][c]!=d)
continue;
for(auto p:e[u]){
int v=get<0>(p),w=get<1>(p),f=get<2>(p);
if(c+w>5000)
continue;
if(!dis[v][c+w]){
dis[v][c+w]=min(dis[u][c],f);
q.push(make_tuple(dis[v][c+w],c+w,v));
continue;
}
if(min(dis[u][c],f)>dis[v][c+w]){
dis[v][c+w]=min(dis[u][c],f);
q.push(make_tuple(dis[v][c+w],c+w,v));
}
}
}
return;
}
signed main(){
srand(time(0));
cin>>n>>m;
for(int i=1,u,v,c,f;i<=m;i++){
cin>>u>>v>>c>>f;
e[u].push_back(make_tuple(v,c,f)),
e[v].push_back(make_tuple(u,c,f));
}
dijkstra();
for(auto it=dis[n].begin();it!=dis[n].end();it++)
ans=max(ans,(int)(1000000.0*(it->second)/(it->first)));
cout<<ans;
return 0;
}