#include <fstream>
#include <vector>
#include <stdbool.h>
#include <queue>
const int N = 30005;
std::vector<std::pair<int, int>> graf[N];
std::ifstream fin("sate.in");
std::ofstream fout("sate.out");
int bfs(int src, int dst, int n, std::vector<std::pair<int, int>> graf[])
{
std::vector<int> dist(n + 1, -1);
std::vector<bool> vizitat(n+1, false);
std::queue<int> coada;
coada.push(src);
vizitat[src] = true;
dist[src] = 0;
while(!coada.empty())
{
int nod = coada.front();
coada.pop();
if(nod == dst)
{
return dist[nod];
}
else
{
for(auto vecin : graf[nod])
{
if(vizitat[vecin.first] == false)
{
dist[vecin.first] = dist[nod] + vecin.second;
vizitat[vecin.first] = true;
coada.push(vecin.first);
}
}
}
}
return -1;
}
int main()
{
int n, m, src, dst;
fin >> n >> m >> src >> dst;
for (int i{0}; i < m; i++)
{
int x, y, d;
fin >> x >> y >> d;
graf[x].push_back(std::make_pair(y, d));
graf[y].push_back(std::make_pair(x, -d));
}
fout<<bfs(src, dst, n, graf);
return 0;
}