Cod sursa(job #712120)
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
struct edge{int v, d;};
int n, m, x, y, d[30000], viz[30000];
vector <edge> G[30000];
queue <int> q;
int main(){
freopen("sate.in", "r", stdin), freopen("sate.out", "w", stdout);
scanf("%d %d %d %d", &n, &m, &x, &y);
int i, a, b, l;
for (i = 0; i < m; i++){
scanf ("%d %d %d", &a, &b, &l);
if (a > b) swap(a, b);
G[a].push_back((edge) {b, l});
G[b].push_back((edge) {a, -l});
}
viz[x] = 1, q.push(x);
while (!q.empty()){
a = q.front(), q.pop();
for (i = 0; i < G[a].size(); i++){
b = G[a][i].v;
if (viz[b] == 0)
viz[b] = 1,
q.push(b),
d[b] = d[a] + G[a][i].d;
}
}
printf("%d", d[y]);
}