#include <bits/stdc++.h>
using namespace std;
ifstream fin("sate.in");
ofstream fout("sate.out");
const int MAXIM = 30005;
vector<pair<int, int>> graf[MAXIM];
vector<pair<int, int>> grafInvers[MAXIM];
map<pair<int, int>, int> muchii;
optional<int> dist(const int a, const int b) {
vector<bool> vizitat(MAXIM, false);
queue<pair<int, int>> q;
q.push({a, 0});
vizitat[a] = true;
while (!q.empty()) {
const auto [sat, scor] = q.front();
q.pop();
if (sat == b) {
return abs(scor);
}
for (const auto [vecin, d] : graf[sat]) {
if (!vizitat[vecin]) {
vizitat[vecin] = true;
q.push({vecin, scor + d});
}
}
for (const auto [vecin, d] : grafInvers[sat]) {
if (!vizitat[vecin]) {
vizitat[vecin] = true;
q.push({vecin, scor - d});
}
}
}
return nullopt;
}
int main() {
int n, m, x, y;
fin >> n >> m >> x >> y;
for (int i = 0; i < m; i++) {
int a, b, c;
fin >> a >> b >> c;
graf[a].push_back({b, c});
grafInvers[b].push_back({a, c});
muchii[{a, b}] = c;
}
fout << dist(x, y).value();
}