// https://omegaup.com/arena/problem/Distancia-minima-entre-dos-vertp      (algoritmo de Dijkstra)
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>

struct pareja {
   int vertice, costo;
};

bool operator<(pareja a, pareja b) {
   return a.costo > b.costo;
}

int main( ) {
   int n, a, e, s;
   std::cin >> n >> a >> e >> s;

   std::vector<pareja> adyacencia[n];
   for (int i = 0; i < a; ++i) {
      int x, y, c;
      std::cin >> x >> y >> c;
      adyacencia[x].push_back({ y, c });
      adyacencia[y].push_back({ x, c });
   }

   std::priority_queue<pareja> cp;
   cp.push({ e, 0 });
   bool procesado[n] = { };
   do {
      pareja actual = cp.top( );
      cp.pop( );
      if (!procesado[actual.vertice]) {
         procesado[actual.vertice] = true;
         if (actual.vertice == s) {
            std::cout << actual.costo;
         }
         for (pareja arista : adyacencia[actual.vertice]) {
            cp.push({ arista.vertice, actual.costo + arista.costo });
         }
      }
   } while (!cp.empty( ));
}
