bool inq[MAX_N];
int d[MAX_N];//如果到顶点i的距离是0x3f3f3f3f,则说明不存在源点到i的最短路径
void spfa(int s){
memset(inq,0,sizeof(inq));
memset(d,0x3f,sizeof(d));
d[s]=0;
inq[s]=true;//进队列为true
queue<int> q;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
inq[u]=false;//出队列为false
for(int i=p[u];i+1;i=e[i].next){
int v=e[i].v;
if(d[u]+e[i].w<d[v]){
d[v]=d[u]+e[i].w;
if(!inq[v]){
q.push(v);
inq[v]=true;
}
}
}
}
}
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
const int MAX_N=100;
const int MAX_M=10000;
struct edge{
int v,next;
int len;
}E[MAX_M];
int p[MAX_N],eid;
void init(){
memset(p,-1,sizeof(p));
eid=0;
}
void insert(int u,int v,int len){
E[eid].v=v;
E[eid].len=len;
E[eid].next=p[u];
p[u]=eid++;
}
bool inq[MAX_N];
int d[MAX_N];
void spfa(int s){
memset(inq,false,sizeof(inq));
memset(d,0x3f,sizeof(d));
d[s]=0;
inq[s]=true;
queue<int> q;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
inq[u]=false;
for(int i=p[u];i+1;i=E[i].next){
int v=E[i].v;
if(d[u]+E[i].len<d[v]){
d[v]=d[u]+E[i].len;
if(!inq[v]){
q.push(v);
inq[v]=true;
}
}
}
}
}
int main() {
int n,m;
cin>>n>>m;
init();
for(int i=0;i<m;++i){
int u,v,len;
cin>>u>>v>>len;
insert(u,v,len);
insert(v,u,len);
}
spfa(1);
for(int i=1;i<=n;++i){
cout<<d[i]<<" ";
}
return 0;
}