#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Muchie {
int vecin;
int pas;
};
const int NMAX =30005;
int n,m,start_nod, dest_nod;
vector<Muchie> graf[NMAX];
int dist[NMAX];
bool vizitat[NMAX];
void bfs(int start, int stop) {
queue<int> coada;
vizitat[start]=true;
dist[start]=0;
coada.push(start);
while(!coada.empty()) {
int nod = coada.front();
coada.pop();
if (nod==stop) {
return;
}
for (int i = 0; i < graf[nod].size(); i++) {
int vecin = graf[nod][i].vecin;
int pas = graf[nod][i].pas;
if (!vizitat[vecin]) {
vizitat[vecin]=true;
dist[vecin]=dist[nod]+pas;
coada.push(vecin);
}
}
}
}
int main() {
freopen("sate.in","r",stdin);
freopen("sate.out","w",stdout);
if (!(cin >> n >> m >> start_nod >> dest_nod)) {
return 0;
}
for (int k = 0; k < m; k++) {
int i,j,d;
cin >> i >> j >> d;
Muchie spre_dreapta;
spre_dreapta.vecin=j;
spre_dreapta.pas=d;
graf[i].push_back(spre_dreapta);
Muchie spre_stanga;
spre_stanga.vecin = i;
spre_stanga.pas = -d;
graf[j].push_back(spre_stanga);
}
bfs( start_nod, dest_nod);
cout<< abs(dist[dest_nod])<<endl;
return 0;
}