#include<iostream>
#include<climits>
#include<cmath>
using namespace std;
const int MAXN=20001;
const int MAXM=40001;
struct Edge{
int u=0;
int v=0;
int w=0;
int next=-1;
}edge[2*MAXM];
int dp[MAXN];
int head[MAXN];
int n,m,s,t;
void solve(int u,int k,int value){
if(value<dp[u])dp[u]=value;
else return;
if(u==s)return;
int pos=head[u];
while(pos!=-1){
solve(edge[pos].v,k+1,value+floor(edge[pos].w/k*1.0));
pos=edge[pos].next;
}
}
int main(){
cin>>n>>m>>s>>t;
int temp[n+1];
for(int i=1;i<=n;i++){
head[i]=-1;
temp[i]=-1;
dp[i]=INT_MAX;
}
for(int i=1;i<=2*m;i++){
int u,v,w;
cin>>u>>v>>w;
edge[i].u=u;edge[i].v=v;edge[i].w=w;
if(head[u]==-1)head[u]=i;
if(temp[u]!=-1){
edge[temp[u]].next=i;
}
temp[u]=i;
i++;
edge[i].u=v;edge[i].v=u;edge[i].w=w;
if(head[v]==-1)head[v]=i;
if(temp[v]!=-1){
edge[temp[v]].next=i;
}
temp[v]=i;
}
solve(t,1,0);
cout<<dp[s];
return 0;
}