#include <bits/stdc++.h>
#define NMAX 10005
using namespace std;
struct edge{
     int u;
     int v;
     int w;
};
edge graph[NMAX];
int n,m,s,t,minimum=INT_MAX;
struct create{
    int len;
    vector<int> DSU,sizeDSU;
    create(int _n):len(_n),DSU(len+1),sizeDSU(len+1,1)
    {
        for(int i=1;i<=len;i++)
        {
            DSU[i]=i;
        }
    };
    int find_root(int u)
    {
        return (DSU[u]==u)?u:DSU[u]=find_root(DSU[u]);
    }
    bool join(int u ,int v)
    {
        int root_u=find_root(u);
        int root_v=find_root(v);
        if(root_u==root_v)
        {
            return false;
        }
        if(sizeDSU[root_u]<sizeDSU[root_v])
        {
            swap(root_u,root_v);
        }
        DSU[root_v]=root_u;
        sizeDSU[root_u]+=sizeDSU[root_v];
        return true;
    }
    bool check(int u ,int v)
    {
        return (find_root(u)==find_root(v))?1:0;
    }
};
void process()
{
     cin>>n>>m>>s>>t;
     create dsu(n);
     for(int i=0;i<m;i++)
     {
         cin>>graph[i].u>>graph[i].v>>graph[i].w;
     }
     sort(graph,graph+m,[](edge &a,edge&b){ return a.w>b.w;});
     for(int i=0;i<m;i++)
     {
         if(!dsu.check(s,t)&&dsu.join(graph[i].u,graph[i].v))
         {
             minimum=graph[i].w;
         }
     }
     cout<<minimum;
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    freopen("TAITRONG.INP","r",stdin);
    freopen("TAITRONG.OUT","w",stdout);
    process();
    return 0;
}
