#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("sate.in");
ofstream fout("sate.out");
/*
void parcurgere(vector<vector<pair<int,int>>> &graph,
vector<long long> &poz, int sat, int pozsat)
{
poz[sat]=pozsat;
for(int nrdrum=0;nrdrum<graph[sat].size();nrdrum++)
if(poz[graph[sat][nrdrum].first]==-1)
parcurgere(graph,poz,graph[sat][nrdrum].first,
graph[sat][nrdrum].second+pozsat);
}
*/
int main ()
{
int n, m, x, y;
fin>>n>>m>>x>>y;
vector<vector<pair<int,int>>> graph(n+1);
vector<long long> poz(n+1,-1);
int nod1,nod2,dist;
while(m)
{
fin>>nod1>>nod2>>dist;
graph[nod1].push_back({nod2,dist});
graph[nod2].push_back({nod1,-dist});
m--;
}
//parcurgere(graph,poz,1,0);
queue<int> lsvizit;
lsvizit.push(x);
poz[1] = 0;
while (!lsvizit.empty())
{
int sat = lsvizit.front();
lsvizit.pop();
for (int nrdrum = 0; nrdrum < graph[sat].size(); ++nrdrum)
{
if (poz[graph[sat][nrdrum].first] == -1)
{
poz[graph[sat][nrdrum].first] = poz[sat] + graph[sat][nrdrum].second;
lsvizit.push(graph[sat][nrdrum].first);
}
}
}
fout<<-poz[x]+poz[y];
fin.close();
fout.close();
return 0;
}