#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int inf = 0x3f3f3f3f;
const int N = 10414;
const int M = 40414;

struct Edge{
	int u, v, d, c;
	int next;
}edge[M];

int cnt, head[N];
int vis[N], dis[N], cost[N];
int op, tp, link[18014];

void add_edge(int u, int v, int d, int c);
void spfa(int n);

int main(){
	int n, m, i, u, v, d, c;
	while(~scanf("%d %d", &n, &m) && (n || m)){
		cnt = 0;
		memset(head, -1, sizeof(head));
		for(i = 0; i < m; i++){
			scanf("%d %d %d %d", &u, &v, &d, &c);
			add_edge(u, v, d, c);
			add_edge(v, u, d, c);
		}
		spfa(n);
	}
	return 0;
}
void add_edge(int u, int v, int d, int c){
	edge[cnt].u = u;
	edge[cnt].v = v;
	edge[cnt].d = d;
	edge[cnt].c = c;
	edge[cnt].next = head[u];
	head[u] = cnt++;
	return;
}
void spfa(int n){
	int i, u, v, d, c, sum;
	memset(vis, 0, sizeof(vis));
	memset(dis, inf, sizeof(dis));
	memset(cost, inf, sizeof(cost));
	op = tp = 0;
	vis[1] = 1, dis[1] = 0, cost[1] = 0;
	link[tp++] = 1;
	while(op < tp){
		u = link[op++];
		vis[u] = 0;
		for(i = head[u]; ~i; i = edge[i].next){
			v = edge[i].v, d = edge[i].d, c = edge[i].c;

			if(dis[v] > dis[u] + d || (dis[v] == dis[u] + d && cost[v] > c)){
				dis[v] = dis[u] + d;
				cost[v] = c;
				if(!vis[v]){
					vis[v] = 1;
					link[tp++] = v;
				}
			}
		}
	}
	sum = 0;
	for(i = 1; i <= n; i++){
		sum += cost[i];
	}
	printf("%d\n", sum);
	return;
}

