//恰好经过k条边的最短距离:允许存在负环。
//d[k][i][j]表示i到j恰好经过k条边的最短距离
//d[a+b,i,j]=min(d[a,i,k]+d[b,k,j]),k=1~n
//满足结合律,因此可用快速幂优化到n^3logn
#include<bits/stdc++.h>
using namespace std;
const int N=210;
int g[N][N],res[N][N],n,m,k,s,t;
void mul(int c[][N],int a[][N],int b[][N])
{
static int tmp[N][N];
memset(tmp,0x3f,sizeof tmp);//经过多于一条边的最短距离
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
tmp[i][j]=min(tmp[i][j],a[i][k]+b[k][j]);
memcpy(c,tmp,sizeof tmp);
}
void qmi()
{
memset(res,0x3f,sizeof res);
for(int i=1;i<=n;i++)res[i][i]=0;//经过0条边自己到自己为0
while(k)
{
if(k&1)mul(res,res,g);
mul(g,g,g);
k>>=1;
}
}
int main()
{
cin>>k>>m>>s>>t;
map<int,int>edges;
memset(g,0x3f,sizeof g);//经过一条边(自己到自己可能没边)的最短距离
if(!edges.count(s))edges[s]=++n;
if(!edges.count(t))edges[t]=++n;
s=edges[s],t=edges[t];
while(m--)
{
int a,b,c;
cin>>c>>a>>b;
if(!edges.count(a))edges[a]=++n;
if(!edges.count(b))edges[b]=++n;
a=edges[a],b=edges[b];
g[a][b]=g[b][a]=min(g[a][b],c);
}
qmi();
cout<<res[s][t]<<endl;
return 0;
}