#include<bits/stdc++.h>
#include<time.h>
using namespace std;
const int INF=1e8;
int n,m,s,t;
struct node{
int cnt,mic,sur;
};
unordered_map<int,int> ma,mb;
vector<pair<int,int> > a[20005];
int flag[30006];
queue<node>q;
int ans=0x7f7f7f7f;
int main(){
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(w<0)continue;
a[u].push_back(make_pair(v,w));
a[v].push_back(make_pair(u,w));
ma[u]=INF;mb[u]=0;
ma[v]=INF;mb[u]=0;
}
node k;k.cnt=t;k.mic=1;k.sur=0;
q.push(k);
while(!q.empty()){
k=q.front();q.pop();
flag[k.cnt]++;
if(k.cnt==s){
ans=min(k.sur,ans);
continue;
}
if(ma[k.cnt]>k.sur&&mb[k.cnt]<k.mic){
ma[k.cnt]=k.sur;
mb[k.cnt]=k.mic;
}
else if(ma[k.cnt]<=k.sur&&mb[k.cnt]>=k.mic)continue;
for(int i=0;i<a[k.cnt].size();i++){
node tmp;
tmp.cnt=a[k.cnt][i].first;
tmp.mic=k.mic+1;
tmp.sur=k.sur+(a[k.cnt][i].second/k.mic);
if(tmp.sur>=ans)continue;
q.push(tmp);
}
}
printf("%d",ans);
return 0;
}