#include<iostream>
using namespace std;
#include<vector>
#include<tuple>
#include<fstream>
#include<list>
#include<queue>
ifstream fin("sate.in");
ofstream fout("sate.out");
int N,M,X,Y;
vector<list<tuple<int,int>>> graf;
vector<int> cost;
vector<int> gasit;
queue<int> q;
int main()
{
fin>>N>>M>>X>>Y;
q.push(X);
graf.resize(N+5);
cost.resize(N+5);
gasit.resize(N+5);
gasit[X]=1;
for(int i=0;i<N;i++)
{
if(i+1!=X)
cost[i+1]=1e9;
}
for(int a=0;a<M;a++)
{
int i,j,D;
fin>>i>>j>>D;
graf[i].push_back(make_tuple(j,D));
graf[j].push_back(make_tuple(i,-D));
}
while(!q.empty())
{
int nod=q.front();
q.pop();
for(auto b:graf[nod])
{
int j=get<0>(b);
int c=get<1>(b);
int acc;
if(gasit[j]==0)
{ acc=cost[nod]+c;
cost[j]=acc;
gasit[j]=1;
if(j==Y)
{
fout<<cost[j];
return 0;
}
q.push(j);
}
}
}
return 0;
}