#include <stdio.h>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=300001;
const int inf =0x7ffffff;
struct edge
{
int from,to,w,next;
}e[1000001];
int head[maxn];
int vis[maxn];
int dist[maxn];
int n,m,t;
void add(int i,int j,int w)
{
e[t].from=i;
e[t].to=j;
e[t].w=w;
e[t].next=head[i];
head[i]=t++;
}
void spfa(int s)
{
queue <int> q;
for(int i=1;i<=n;i++)
dist[i]=inf;
memset(vis,false,sizeof(vis));
q.push(s);
dist[s]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u];i!=-1;i=e[i].next)
{
int v=e[i].to;
if(dist[v]>dist[u]+e[i].w)
{
dist[v]=dist[u]+e[i].w;
if(!vis[v])
{
vis[v]=true;
q.push(v);
}
}
}
}
}
int main()
{
int a,b,c,s,e;
scanf("%d%d",&n,&m);
t=0;
memset(head,-1,sizeof(head));
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
scanf("%d%d",&s,&e);
spfa(s);
if(dist[e]==inf) printf("-1\n");
else printf("%d\n",dist[e]);
return 0;
}
#include <iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAX 200001
#define INF 99999999
typedef struct XNode
{
int pow;//边的权值
int adjvex;//点
struct XNode *next;
}Node;
Node * head[MAX];
int visit[MAX],dis[MAX];
void add(int u,int v,int w)
{
Node *p;
p=(Node*)malloc(sizeof(Node));
p->pow=w;
p->adjvex=v;
p->next=head[u];
head[u]=p;
}
void SPFA(int n)
{
int u,v,w;
queue<int>Q;//这个算法关键使用队列来处理问题
Node *p;
for(int i=1;i<=n;i++)//初始化
{
visit[i]=0;
dis[i]=INF;
}
Q.push(1);//头结点进队
dis[1]=0;
visit[1]=1;
while(!Q.empty())//直到队列为空才结束循环
{
u=Q.front();//头结点
Q.pop();//进队
for(p=head[u];p!=NULL;p=p->next)
{
v=p->adjvex;
w=p->pow;
if(dis[u]+w<dis[v])
{
dis[v]=dis[u]+w;
if(!visit[v])
{
visit[v]=1;
Q.push(v);//出队
}
}
}
}
}
int main()
{
int n,m,u,v,w;
while(cin>>n>>m){
memset(head,NULL,sizeof(head));//初始化
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
SPFA(n);
for(int i=2;i<=n;i++)
cout<<dis[i]<<endl;
}
return 0;
}