using namespace std;
#include <cstdio>
#include <string>
#define FIN "pscnv.in"
#define FOUT "pscnv.out"
#define NMAX 100001
#define INF 0x3f3f3f3f
int N, M, dimheap, *lv[NMAX], *cost[NMAX], gr[NMAX];
int h[NMAX], ind[NMAX], dist[NMAX], t, s;
void citire ()
{
int i, j, a, b, c;
freopen (FIN, "rt", stdin);
scanf ("%d%d%d%d", &N, &M, &s, &t);
for (i = 1; i <= M; ++ i)
{
scanf ("%d%d%d", &a, &b, &c);
++gr[a];
}
for (i = 1; i <= N; ++ i)
{
lv[i] = new int [gr[i] + 1];
cost[i] = new int [gr[i] + 1];
lv[i][0] = 0;
}
fseek (stdin, 0, SEEK_SET);
scanf ("%d%d%d%d", &N, &M, &s, &t);
for (i = 1; i <= M; ++ i)
{
scanf ("%d%d%d", &a, &b, &c);
lv[a][++lv[a][0]] = b;
cost[a][lv[a][0]] = c;
}
}
void combheap (int a)
{
int tata, fiu, v;
v = h[a];
tata = a;
fiu = 2*a;
while (fiu <= dimheap)
{
if (fiu < dimheap)
if (dist[h[fiu+1]] < dist[h[fiu]])
++ fiu;
if (dist[v] < dist[h[fiu]]) break;
h[tata] = h[fiu];
ind[h[tata]] = tata;
tata = fiu;
fiu = tata*2;
}
h[tata] = v;
ind[h[tata]] = tata;
}
void update (int a)
{
int tata, fiu, v;
v = h[a];
fiu = a;
tata = fiu / 2;
while (tata > 0)
{
if (dist[v] > dist[h[tata]]) break;
h[fiu] = h[tata];
ind[h[fiu]] = fiu;
fiu = tata;
tata = fiu / 2;
}
h[fiu] = v;
ind[h[fiu]] = fiu;
}
int max (int x, int y)
{
return x > y ? x : y;
}
void dijkstra ()
{
int i, j, nod, min;
memset (dist, INF, sizeof(dist));
dist[s] = 0;
dimheap = N;
for (i = 1; i <= N; ++ i)
{
h[i] = i;
ind[i] = i;
}
for (i = dimheap/2; i > 0; -- i)
combheap (i);
for (i = 1; i <= N; ++ i)
{
nod = h[1];
h[1] = h[dimheap--];
combheap (1);
for (j = 1; j <= lv[nod][0]; ++ j)
if (dist[lv[nod][j]] > max (dist[nod], cost[nod][j]))
{
dist[lv[nod][j]] = max (dist[nod], cost[nod][j]);
update (ind[lv[nod][j]]);
}
}
freopen (FOUT, "wt", stdout);
//for (i = 1; i <= N; ++ i)
// printf ("%d ", dist[i]);
printf ("%d\n", dist[t]);
}
int
main ()
{
citire ();
dijkstra ();
return 0;
}