#include <bits/stdc++.h>
#define INF (1<<30)
#define MAX 200010
using namespace std;
struct edge { int to, next, w; };
edge es[MAX];
int v, e, cnt;
int head[MAX], d[MAX], in[MAX];
bool vis[MAX];
void add_edge(int u, int v, int w)
{
es[++cnt].to = v;
es[cnt].next = head[u];
es[cnt].w = w;
head[u] = cnt;
}
bool spfa(int st)
{
queue<int> q;
for (int i = 0; i < max(v, e); i++) {
vis[i] = 0;
d[i] = INF;
in[i] = 0;
}
q.push(st);
vis[st] = 1;
d[st] = 0;
while (!q.empty()) {
int t = q.front();
q.pop();
vis[t] = 0;
for (int i = head[t]; i; i = es[i].next) {
int temp = es[i].to;
if (d[temp] > d[t] + es[i].w) {
d[temp] = d[t] + es[i].w;
if (!vis[temp]) {
q.push(temp);
vis[temp] = 1;
if (++in[temp] >= v) return false; //有环
}
}
}
}
return true;
}
int main()
{
int s, t;
cin >> v >> e >> s >> t;
cnt = 0;
for (int i = 1; i <= e; i++) {
int u, v, w;
cin >> u >> v >> w;
add_edge(u, v, w);
}
if (spfa(s)) cout << d[t] << endl;
return 0;
}