#include<bits/stdc++.h> using namespace std; const int maxn=205; const int inf=0x3f3f3f3f; int n,m,g[maxn][maxn],vis[maxn],dis[maxn]; int main(){ int a,b,x,s,t,minn,nex; while(cin>>n>>m){ for(int i=0;i<n;i++){ dis[i]=inf;vis[i]=1; for(int j=0;j<n;j++){ g[i][j]=inf; } } for(int i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&x); g[a][b]=min(g[a][b],x); g[b][a]=g[a][b]; } cin>>s>>t; vis[s]=0;dis[s]=0; //dis不能放while里面 while(s!=t){ minn=inf; //minn赋值应放while里面 while每次找一个最近点时minn都初始为inf for(int i=0;i<n;i++){ if(g[s][i]!=inf){ dis[i]=min(dis[s]+g[s][i],dis[i]); } if(dis[i]<minn&&vis[i]){//vis记录这个点是否已为最近点之一 若已为则不用考虑这点 minn=dis[i]; nex=i; } } if(minn==inf) break; s=nex;vis[s]=0; } if(dis[t]!=inf) cout<<dis[t]<<endl; //得用dis[t]不用minn 因为g[i][i]定义为inf了 所以当初始s==t时不进while,minn未定义 else cout<<"-1"<<endl; } }