#include <cstdio>
#include <fstream>
#include <vector>
#define DIM 101000
using namespace std;
//FILE *fin = fopen("sate.in" , "r");
//FILE *fout= fopen("sate.out", "w");
ifstream fin ("sate.in" );
ofstream fout("sate.out");
int N, M, i, j, x, y, z, D[DIM];
int C[DIM], istart, ifinish;
int F[DIM], p, u, val, d;
vector < int > V[DIM];
char S[DIM];
void SetUp(){
//fscanf(fin, "%d%d%d%d", &N, &M, &istart, &ifinish);
fin >> N >> M >> istart >> ifinish;
for(i = 1; i <= M; i ++){
//fscanf(fin, "%d%d%d", &x, &y, &z);
fin.get();
fin.get(S + 1, DIM);
x = y = z = 0;
j = 1;
while(S[j] >= '0' && S[j] <= '9'){
x = x * 10 + (S[j] - '0');
j ++;
}
j ++;
while(S[j] >= '0' && S[j] <= '9'){
y = y * 10 + (S[j] - '0');
j ++;
}
j ++;
while(S[j] >= '0' && S[j] <= '9'){
z = z * 10 + (S[j] - '0');
j ++;
}
V[x].push_back(y);
V[x].push_back(z);
V[y].push_back(x);
V[y].push_back(-z);
}
p = 1; u = 1;
C[p] = istart;
return;
}
void BFS(){
while(p <= u){
val = C[p]; F[val] = 1;
for(d = 0; d < V[val].size(); d += 2){
if(F[V[val][d]] == 0){
D[V[val][d]] = D[val] + V[val][d+1];
u ++; C[u] = V[val][d];
}
if(D[ifinish] != 0)
break;
}
if(D[ifinish] != 0)
break;
p ++;
}
//fprintf(fout, "%d", D[ifinish]);
fout << D[ifinish];
return;
}
int main(){
SetUp();
BFS();
return 0;
}