#include <iostream> using namespace std; int const INF=1000000001; int const MAXN=310; int N,S,T,E,tot; int map[MAXN][MAXN],ans[MAXN][MAXN],dis[MAXN][MAXN],tmp[MAXN][MAXN]; int test[1010],flag[1010]; void floyd(int c[MAXN][MAXN],int a[MAXN][MAXN],int b[MAXN][MAXN]) { int i,j,k; for(k=1;k<=tot;k++) for(i=1;i<=tot;i++) for(j=1;j<=tot;j++) if(a[i][k]+b[k][j]<c[i][j]) c[i][j]=a[i][k]+b[k][j]; } void copy(int a[MAXN][MAXN],int b[MAXN][MAXN]) { int i,j; for(i=1;i<=tot;i++) for(j=1;j<=tot;j++) { a[i][j]=b[i][j]; b[i][j]=INF; } } void solve(int n) { while(n) { if(n%2) { floyd(dis,ans,map); copy(ans,dis); } floyd(tmp,map,map); copy(map,tmp); n>>=1; } printf("%d/n",ans[S][E]); } void read_data() { int i,j,k,len; tot=0; memset(flag,0,sizeof(flag)); for(i=0;i<MAXN;i++)//初始化不能用memset函数,我就在这里挂了好久 for(j=0;j<MAXN;j++) { map[i][j]=INF; ans[i][j]=INF; dis[i][j]=INF; tmp[i][j]=INF; } for(k=1;k<=T;k++) { scanf("%d%d%d",&len,&i,&j); if(!flag[i]) { test[i]=++tot; flag[i]=1; } if(!flag[j]) { test[j]=++tot; flag[j]=1; } if(map[test[i]][test[j]]>len) { map[test[i]][test[j]]=len; map[test[j]][test[i]]=len; } } S=test[S]; E=test[E]; for(i=0;i<=MAXN;i++) ans[i][i]=0; } int main() { freopen("input.txt","r",stdin); while(cin>>N>>T>>S>>E) { read_data(); solve(N); } return 0; }