http://www.rqnoj.cn/problem/341
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const int M=30005;
struct node{
int v,c;
node(){
};
node(int x,int y){ v=x;c=y;
}
bool operator <(const node &a) const{
if(c==a.c) return v>a.v;
return c>a.c;
}
};
vector<node>g[M];
int d[M],vis[M];
int n,m;
void dijkstra(){
priority_queue<node>Q;
memset(d,-1,sizeof(d));
int u,v,cost;
node p;
d[1]=0;
vis[1]==1;
Q.push(node(1,d[1]));
while(!Q.empty()){
p=Q.top(); Q.pop();
u=p.v;
if(vis[u]==1) continue;
vis[u]==1;
d[u]=p.c;
if(u==n) break;
for(int i=0;i<g[u].size();i++){
v=g[u][i].v;
cost=g[u][i].c;
if(d[v]==-1||d[v]>d[u]+cost)
Q.push(node(v,d[u]+cost));
}
}
}
int main(){
cin>>n>>m;
int x,y,z;
while(m--){
cin>>x>>y>>z;
g[x].push_back(node(y,z));
g[y].push_back(node(x,z));
}
dijkstra();
cout<<d[n];
return 0;
}