#include<bits/stdc++.h>
using namespace std;
struct Edge{
int u,v;long long w;int nxt;
};
class Graph{
public:
int head[10010];
Edge edge[50010]; int cntE;
void AddEdge(int u,int v,long long w){
edge[++cntE].u=u;
edge[cntE].v=v;
edge[cntE].w=w;
edge[cntE].nxt=head[u];
head[u]=cntE;
}
}gpsA,gpsB,FINAL;
class Dijkstra{
public:
long long dis[10010]; bool vis[10010];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
void dijkstra(int head[],Edge edge[],int cnt,int st){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
while(!q.empty()) q.pop();
dis[st]=0;
q.push(make_pair(0,st));
while(!q.empty()){
int k=q.top().second; q.pop();
if(vis[k]) continue;
vis[k]=1;
for(int i=head[k];i;i=edge[i].nxt){
if(dis[k]+edge[i].w<dis[edge[i].v]){
dis[edge[i].v]=dis[k]+edge[i].w;
q.push(make_pair(dis[edge[i].v],edge[i].v));
}
}
}
}
}GPSa,GPSb,Final;
int n,m,st,ed,u,v;long long w1,w2;
int main(){
scanf("%d%d",&n,&m);
st=1; ed=n;
for(int i=1;i<=m;i++){
scanf("%d%d%lld%lld",&u,&v,&w1,&w2);
gpsA.AddEdge(u,v,w1);
gpsB.AddEdge(u,v,w2);
}
GPSa.dijkstra(gpsA.head,gpsA.edge,gpsA.cntE,st);
GPSb.dijkstra(gpsB.head,gpsB.edge,gpsB.cntE,st);
for(int i=1;i<=m;i++){
int tot=0;
if(GPSa.dis[gpsA.edge[i].u]+gpsA.edge[i].w!=GPSa.dis[gpsA.edge[i].v]) tot++;
if(GPSb.dis[gpsB.edge[i].u]+gpsB.edge[i].w!=GPSb.dis[gpsB.edge[i].v]) tot++;
FINAL.AddEdge(gpsA.edge[i].u,gpsA.edge[i].v,tot);
}
Final.dijkstra(FINAL.head,FINAL.edge,FINAL.cntE,st);
printf("%lld",Final.dis[ed]);
}
#3,#7,#10 都 WA 了,是什么情况啊?