#include using namespace std; //#define int long long #define REP(i,m,n) for(int i=(m);i<(n);i++) #define rep(i,n) REP(i,0,n) #define pb push_back #define all(a) a.begin(),a.end() #define rall(c) (c).rbegin(),(c).rend() #define mp make_pair #define endl '\n' #define vec vector #define mat vector > #define fi first #define se second typedef long long ll; typedef unsigned long long ull; typedef pair pll; typedef long double ld; typedef complex comp; const ll INF=1e9+7; const ll inf=INF*INF; const ll MOD=998244353; const ll mod=MOD; const ll MAX=200010; const double PI=acos(-1.0); //dijkstra(O(ElogV)) //0-indexed void dijkstra(ll n,ll s,vector >&G,vector &d,vector&prev){ priority_queue,greater >pq; rep(i,n){ d[i]=inf; } d[s]=0; pq.push(mp(0,s)); while(!pq.empty()){ pll k=pq.top();pq.pop(); ll v=k.second; if(d[v]d[v]+e.second){ d[e.first]=d[v]+e.second; prev[e.fi]=v; pq.push(mp(d[e.first],e.first)); } } } } signed main(){ ll n,m;cin>>n>>m; vectoru(m),v(m),c(m),d(m); rep(i,m){ cin>>u[i]>>v[i]>>c[i]>>d[i]; u[i]--;v[i]--; } ll len1,len2; vectorprev(n); setst; { vector >G(n); vectordist(n); rep(i,m){ G[u[i]].pb(mp(v[i],c[i])); G[v[i]].pb(mp(u[i],c[i])); } dijkstra(n,0,G,dist,prev); len1=dist[n-1]; ll now=n-1; while(now!=0){ st.insert(mp(prev[now],now)); st.insert(mp(now,prev[now])); now=prev[now]; } } { vector >G(n); vectordist(n); rep(i,m){ if(!st.count(mp(u[i],v[i]))){ G[u[i]].pb(mp(v[i],c[i])); G[v[i]].pb(mp(u[i],c[i])); }else{ G[u[i]].pb(mp(v[i],d[i])); G[v[i]].pb(mp(u[i],d[i])); } } dijkstra(n,0,G,dist,prev); len2=dist[n-1]; } cout<