#include <bits/stdc++.h>
using namespace std;
ifstream fin("sate.in");
ofstream fout("sate.out");
const int MAXN = 30005;
const int MAXM = 200055;
int head[MAXN], to[MAXM], weight[MAXM], nxt[MAXM], edge_cnt;
int dist_node[MAXN];
bool vis[MAXN];
void add_edge(int u, int v, int w) {
to[++edge_cnt] = v;
weight[edge_cnt] = w;
nxt[edge_cnt] = head[u];
head[u] = edge_cnt;
}
int main() {
int n, m, x, y;
fin >> n >> m >> x >> y;
for (int k = 0; k < m; ++k) {
int i, j, d;
fin >> i >> j >> d;
add_edge(i, j, d);
add_edge(j, i, -d);
}
queue<int> q;
q.push(x);
vis[x] = true;
dist_node[x] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
if (u == y) break;
for (int e = head[u]; e != 0; e = nxt[e]) {
int v = to[e];
if (!vis[v]) {
vis[v] = true;
dist_node[v] = dist_node[u] + weight[e];
q.push(v);
}
}
}
fout << abs(dist_node[y]) << "\n";
return 0;
}