// https://omegaup.com/arena/problem/Clausura-de-carreteras
#include <iostream>
#include <queue>
#include <vector>

struct dato {
   int vertice;
   long long distancia;
   long long costo;
};

bool operator<(dato d1, dato d2) {
   if (d1.distancia != d2.distancia) {
      return d1.distancia > d2.distancia;
   } else {
      return d1.costo > d2.costo;
   }
}

int main( ) {
   int n, m;
   std::cin >> n >> m;

   std::vector<std::vector<dato>> listas(n);
   for (int i = 0; i < m; ++i) {
      int v1, v2, d, c;
      std::cin >> v1 >> v2 >> d >> c;
      v1 -= 1, v2 -= 1;
      listas[v1].push_back(dato(v2, d, c));
      listas[v2].push_back(dato(v1, d, c));
   }

   std::vector<long long> distancias(n, -1);
   std::priority_queue<dato> cp;
   cp.push(dato(0, 0, 0));
   long long res = 0;

   while (!cp.empty( )) {
      dato d = cp.top( );
      cp.pop( );
      if (distancias[d.vertice] == -1) {
         distancias[d.vertice] = d.distancia;
         res += d.costo;
         for (dato a : listas[d.vertice]) {
            cp.push(dato(a.vertice, d.distancia + a.distancia, a.costo));
         }
      }
   }

   std::cout << res;
}
