#include<stdio.h>
#include<utility>
#include<queue>
#include<vector>
#include<algorithm>
#define MAX_N 10000
#define INF 100000000
using namespace std;

typedef pair<int,int>P;

typedef struct edge
{
	int t,dist,cost;
} edge;

struct StructGreater {
	bool operator() (edge a, edge b) {
		return a.dist==b.dist?a.cost>b.cost:a.dist>b.dist;
	}
};

vector<edge>G[MAX_N];

int N,M,mincost[MAX_N],mindist[MAX_N];

int prim()
{
	int flg[MAX_N];
	priority_queue<edge,vector<edge>,StructGreater>que;
	for(int i=0;i<N;i++)
	{
		mindist[i]=INF;
		mincost[i]=INF;
		flg[i]=0;
	}
	mincost[0]=0;
	edge t1={0,0,0};
	que.push(t1);
	int res=0;
	while(!que.empty())
	{
		edge tmp=que.top();
		que.pop();
		if(!flg[tmp.t])
		{
			res+=tmp.cost;
			mindist[tmp.t]=tmp.dist;
			mincost[tmp.t]=tmp.cost;
			flg[tmp.t]=1;
			for(int u=0;u<G[tmp.t].size();u++)
				if(mindist[G[tmp.t][u].t]>G[tmp.t][u].dist&&mincost[G[tmp.t][u].t]>G[tmp.t][u].cost)
				{
					edge t2={G[tmp.t][u].t,mindist[tmp.t]+G[tmp.t][u].dist,G[tmp.t][u].cost};
					que.push(t2);
				}
		}
	}
	return res;
}

int main()
{
	for(;scanf("%d%d",&N,&M);)
	{
		if(N==0&&M==0)
			break;
		for(int i=0;i<M;i++)
		{
			int a,b,c,d;
			scanf("%d%d%d%d",&a,&b,&c,&d);
			a--,b--;
			edge t1={b,c,d};
			edge t2={a,c,d};
			G[a].push_back(t1);
			G[b].push_back(t2);
		}
		printf("%d\n",prim());
		for(int i=0;i<N;i++)
			G[i].clear();
	}
	return 0;
}