代码:
#include <bits/stdc++.h>
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <cstring>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <complex.h>
#include <fenv.h>
#include <inttypes.h>
#include <stdbool.h>
#include <stdint.h>
#include <tgmath.h>
using namespace std;
int n;
int t;
const int N=1e6+10;
const int T=100+10;
int dp[5][T];
int m;
struct Edge{
int x,y,len,next;
}e[T*2];
int elast[T];
bool Map[1010];
void add(int a,int b,int d){
e[++m]={a,b,d,elast[a]};
elast[a]=d;
}
int L[T],R[T],Len[T];
int turn[1010];
int maxx;
int minn=1000;
int d;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int S,E;
cin>>n>>t>>S>>E;
for(int i=1;i<=t;i++){
cin>>Len[i]>>L[i]>>R[i];
Map[L[i]]=true;
Map[R[i]]=true;
maxx=max(maxx,max(L[i],R[i]));
minn=min(minn,min(L[i],R[i]));
}
for(int i=minn;i<=maxx;i++) if(Map[i]) turn[i]=++d;
for(int i=1;i<=t;i++){
add(turn[L[i]],turn[R[i]],Len[i]);
add(turn[R[i]],turn[L[i]],Len[i]);
}
S=turn[S];
E=turn[E];
memset(dp,0x3f,sizeof(dp));
dp[0][S]=0;
int now=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=d;j++){
int num=elast[j];
while(num){
dp[now][j]=min(dp[now^1][e[num].y]+e[num].len,dp[now][j]);
num=e[num].next;
}
}
for(int j=1;j<=d;j++){
dp[now^1][j]=0x3f3f3f3f;
}
now=now^1;
}
cout<<dp[now^1][E];
return 0;
}