1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<string>
5 #include<cmath>
6 #include<algorithm>
7 #include<vector>
8 #include<queue>
9 using namespace std;
10 struct edge
11 {
12 int to,next,val;
13 }fet[400039],ret[400039];
14 int n,fhd[40039],shd[40039],tot,rot,dis[40039],fir[40039],S,T,stp=0x3f3f3f3f;
15 bool inq[40039],Sinogi[40039];
16 void add(int u,int v,int ws,int wr)
17 {
18 fet[++tot].to=v,fet[tot].next=fhd[u],fet[tot].val=ws,fhd[u]=tot;
19 fet[++tot].to=u,fet[tot].next=fhd[v],fet[tot].val=wr,fhd[v]=tot;
20 }
21 void add(int u,int v,int w)
22 {
23 ret[++rot].to=v,ret[rot].next=shd[u],ret[rot].val=w,shd[u]=rot;
24 }
25 void spfa(edge net[],int head[])
26 {
27 memset(dis,63,sizeof(dis));
28 queue<int>que;
29 que.push(S),dis[S]=0,inq[S]=1,fir[S]=S;
30 int a,b;
31 while(!que.empty())
32 {
33 a=que.front(),que.pop();
34 for(b=head[a];b!=-1;b=net[b].next)
35 {
36 if(dis[net[b].to]>dis[a]+net[b].val)
37 {
38 dis[net[b].to]=dis[a]+net[b].val;
39 fir[net[b].to]=(fir[a]==S ? net[b].to : fir[a]);
40 if(!inq[net[b].to])
41 {
42 que.push(net[b].to);
43 inq[net[b].to]=1;
44 }
45 }
46 }
47 inq[a]=0;
48 }
49 }
50 void rebuild(edge net[],int head[])
51 {
52 int a,b;
53 for(a=1;a<=n;a++)
54 {
55 for(b=head[a];b!=-1;b=net[b].next)
56 {
57 if(a==S)
58 {
59 if(fir[net[b].to]!=net[b].to)
60 {
61 add(1,net[b].to,net[b].val);
62 }
63 }
64 else if(net[b].to==S)
65 {
66 if(fir[a]!=a)
67 {
68 add(S,T,dis[a]+net[b].val);
69 }
70 else
71 {
72 add(a,T,net[b].val);
73 }
74 }
75 else
76 {
77 if(fir[a]!=fir[net[b].to])
78 {
79 add(S,net[b].to,dis[a]+net[b].val);
80 }
81 else
82 {
83 add(a,net[b].to,net[b].val);
84 }
85 }
86 }
87 }
88 }
89 int main()
90 {
91 memset(fhd,-1,sizeof(fhd));
92 memset(shd,-1,sizeof(shd));
93 int m,ans=0x3f3f3f3f,a,b,c,d,e;
94 scanf("%d%d",&n,&m);
95 for(a=1;a<=m;a++)
96 {
97 scanf("%d%d%d%d",&b,&c,&d,&e);
98 if(b==1)
99 {
100 Sinogi[c]=1,dis[c]=d;
101 }
102 if(c==1 && Sinogi[b])
103 {
104 stp=min(stp,d+dis[b]);
105 }
106 add(b,c,d,e);
107 }
108 S=1;
109 spfa(fet,fhd);
110 T=n+1;
111 rebuild(fet,fhd);
112 spfa(ret,shd);
113 printf("%d",min(stp,dis[T]));
114 return 0;
115 }