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

#include<cstdio>

#include<cstdlib>

#include<string>

#include<cstring>

#include<algorithm>

#include<queue>

#include<vector>

#define N 20100

#define M 50010

#define rg register

using namespace std;

typedef long long ll;

typedef double db;

int n,m,tot=0;

int dis[N],head[N],vis[N];

int nxt[M],to[M],w[M],c[M];

void link(int x,int y,int z,int v){

	nxt[tot]=head[x],to[tot]=y,w[tot]=z,c[tot]=v,head[x]=tot++;

}

void spfa(){

	queue <int> q;

	memset(dis,0x3f,sizeof(dis));

	memset(vis,0,sizeof(vis));

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

	while (!q.empty()){

		int x=q.front();q.pop();

		for (int i=head[x];i!=-1;i=nxt[i]){

			int v=to[i];

			if (dis[v]<=dis[x]+w[i]) continue;

			dis[v]=dis[x]+w[i];

			if (!vis[v]) vis[v]=1,q.push(v);

		}

		vis[x]=0;

	}

}

int main(){

//	freopen ("2249.in","r",stdin);

//	freopen ("2249.out","w",stdout);

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

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

		tot=0;int x,y,z,v;

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

			scanf ("%d%d%d%d",&x,&y,&z,&v);

			link(x,y,z,v),link(y,x,z,v);

		}

		spfa();

		int ans=0;

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

			int mx=2000;

			for (int j=head[i];j!=-1;j=nxt[j]){

				v=to[j];

				if (dis[i]==dis[v]+w[j]) mx=min(mx,c[j]);

			}

			ans+=mx;

		}

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

	

	}

	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.255850833211949x):
#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;

}