#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#define ls k<<1
#define rs k<<1|1
#define RG register
#define MAXN 50010
#define LL long long int
using namespace std;
const int INF=0x7fffffff;
struct node{
	int next;
	int to;
	int w;
	int c;
}t[MAXN];
int head[MAXN];
int num;
int dis[MAXN],vis[MAXN],cost[MAXN];
int n,m;
void add(int from,int to,int w,int c)
{
	t[++num].next=head[from];
	t[num].to=to;
	t[num].w=w;
	t[num].c=c;
	head[from]=num;
}
void spfa()
{
	for(int i=1;i<=n;i++)
		{
			dis[i]=INF;vis[i]=0;cost[i]=INF;
		}
	cost[1]=dis[1]=0;vis[1]=1;
	queue<int>q;q.push(1);
	while(!q.empty())
		{
			int u=q.front();q.pop();vis[u]=0;
			for(int i=head[u];i;i=t[i].next)
				{
					int v=t[i].to;
					if(dis[v]>dis[u]+t[i].w||(dis[v]==dis[u]+t[i].w&&cost[v]>t[i].c))
						{
							dis[v]=dis[u]+t[i].w;
							cost[v]=t[i].c;
							if(!vis[v])
								{
									vis[v]=1;q.push(v);
								}
						}
				}
		}
}
int main()
{
	//freopen("1.in","r" ,stdin);
	//freopen("1.out","w",stdout);
	while(1)
		{
			scanf("%d%d",&n,&m);if(n==0&&m==0) break;
			int x,y,z,k;
			memset(head,0,sizeof(head));num=0;
			for(int i=1;i<=m;i++)
				{
					scanf("%d%d%d%d",&x,&y,&z,&k);
					add(x,y,z,k);add(y,x,z,k);
				}
			spfa();
			int ans=0;
			for(int i=1;i<=n;i++) ans+=cost[i];
			cout<<ans<<endl;
		}
	return 0;
}