// Slower C++ solution:
#include<iostream>

#include<queue>

#include<cstdlib>

#include<cstdio>

#include<cstring>



using namespace std;

const int maxn=4e4+100;

const int inf=0x3f3f3f3f;



struct Edge{

    int next;

    int to;

    int w;

    int  c;



}G[maxn];



int inq[maxn];

int dis[maxn];

int head[maxn];

int k=0;





void adde(int v,int to,int w,int c)//加?

{

    G[k].to=to;//第k条?指向的点

    G[k].w=w;//第k条?的??

    G[k].c=c;

    G[k].next=head[v];//与第k条??同起点的上一条?的?存位置

    head[v]=k++;

}



queue<int>Q;



void spfa(int s)

{

        while(!Q.empty())Q.pop();

        memset(inq,0,sizeof(inq));

        memset(dis,inf,sizeof(dis));

        dis[s] = 0;

        inq[s] = 1;

        Q.push(s);

        while(!Q.empty())

        {

                int u = Q.front();

                Q.pop();

                inq[u]=0;

                for(int i=head[u];i!=-1;i=G[i].next)//遍?以u?起点的所有?

                {

                        int v=G[i].to;

                        if(dis[v]>dis[u]+G[i].w)

                        {

                                dis[v]=dis[u]+G[i].w;

                                if(inq[v]==0)

                                {

                                    Q.push(v);

                                    inq[v]=1;

                                }

                        }

                }

                inq[u]=0;



        }

}



int main()

{

        int n,m;

        while(scanf("%d%d",&n,&m)!=EOF)

        {

                if(n==0&m==0)

                        return 0;

                memset(head,-1,sizeof(head));



                k=0;

                for(int i=0;i<m;i++)

                {

                            int a,b,c,d;

                            scanf("%d%d%d%d",&a,&b,&c,&d);

                            adde(a,b,c,d);

                            adde(b,a,c,d);

                }

                spfa(1);

                int ans=0;

                for(int i=2;i<=n;++i)

                {

                        int mi=inf;

                        for(int j=head[i];j!=-1;j=G[j].next)

                        {

                                if(dis[G[j].to]+G[j].w==dis[i]&&G[j].c<mi)

                                        mi=G[j].c;

                        }

                        ans+=mi;

                }

                printf("%d\n",ans);

        }

        return 0;



}

// Faster C++ solution for the same problem (measured speedup: 1.5547131441499606x):
#include <cstdio>

#include <cstdlib>

#include <iostream>

#include <cstring>

#include <cmath>

#include <ctime>

#include <algorithm>

#include <vector>

#include <set>

#include <queue>

#include <map>

#include <stack>

#include <bitset>

using namespace std;

typedef int gitype;

gitype gi () {

    gitype ret=0; char ch=getchar();

    while((ch<'0' || ch>'9') && ch!='-') ch=getchar();

    char c=ch=='-'?getchar():ch;

    while(c>='0' && c<='9') ret=ret*10+c-'0',c=getchar();

    return ch=='-'?-ret:ret;

}

const int N = 10010;

const int M = 100010;

int n,m,st[N],vis[N],dis[N],pt[M],nxt[M],w[M],c[M],cost[N],ent=0;

void link (int u,int v,int _w,int _c) {

    pt[++ent]=v; nxt[ent]=st[u]; st[u]=ent; w[ent]=_w; c[ent]=_c;

    pt[++ent]=u; nxt[ent]=st[v]; st[v]=ent; w[ent]=_w; c[ent]=_c;

}

queue<int> q;

int main () {

    while(scanf("%d%d",&n,&m)==2 && (n || m)) {

        memset(st,0,sizeof(st)); ent=0;

        int u,v,_w,_c;

        for(int i=1;i<=m;i+=1) {

            u=gi(); v=gi(); _w=gi(); _c=gi(); link(u,v,_w,_c);

        }

        for(int i=1;i<=n;i+=1) dis[i]=1e9 + 5;

        dis[1]=0; q.push(1);

        while(!q.empty()) {

            int r=q.front(); q.pop(); vis[r]=false;

            for(int i=st[r];i;i=nxt[i]) {

                if(dis[pt[i]] > dis[r]+w[i]) {

                    dis[pt[i]] = dis[r]+w[i]; cost[pt[i]] = c[i];

                    if(!vis[pt[i]]) {

                        vis[pt[i]] = true; q.push(pt[i]);

                    }

                } else if(dis[pt[i]] == dis[r]+w[i]) {

                    cost[pt[i]] = min(cost[pt[i]], c[i]);

                }

            }

        }

        int ans = 0;

        for(int i=2;i<=n;i+=1) ans += cost[i];

        printf("%d\n",ans);

    }

    return 0;

}