板子
#include<iostream>
#include<cstring>
#include<queue>
#include<utility>
#define mk make_pair
using namespace std;
const int maxn = 1e3+5;
const int INF = 0x3f3f3f3f;
struct node {
int v,w,nxt;
} edge[maxn];
int head[210],tot;
void init() {
memset(head,-1,sizeof(head));
}
void add(int u,int v,int w) {
edge[tot].w = w;
edge[tot].v = v;
edge[tot].nxt = head[u];
head[u] = tot++;
}
int n,m,d[maxn];
void dij(int start,int end) {
memset(d,INF,sizeof(d));
priority_queue<pair<int,int> > q;
q.push(mk(0,start));
d[start] = 0;
while(!q.empty()) {
int k = q.top().second;
q.pop();
for(int i=head[k]; i!=-1; i=edge[i].nxt) {
if(d[edge[i].v] > d[k]+edge[i].w){
d[edge[i].v] = d[k] + edge[i].w;
q.push(mk(-d[edge[i].v],edge[i].v));
}
}
}
}
int main() {
int u,v,w,start,end;
while(~scanf("%d%d",&n,&m)) {
memset(head,-1,sizeof(head));
tot = 0;
for(int i=0; i<m; i++) {
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
scanf("%d%d",&start,&end);
dij(start,end);
printf("%d\n",d[end]==INF?-1:d[end]);
}
return 0;
}