#include <bits/stdc++.h>
using namespace std;
#define nod first
#define weight second
#define inf 9223372036854775807LL
int from,to,cost,n,m;
vector <int> sol;
long long d[50013];
class undirected_graf
{
private :
vector < pair <int,int> > G[100013];
bool used[100013];
struct cmp{
bool operator()(const int &a,const int &b){
return d[a]>d[b];
}
};
public :
void add (int from, int to, int cost){
G[from].push_back(make_pair(to,cost));
swap(from,to);
G[from].push_back(make_pair(to,cost));
}
long long Dijkstra(int sursa){
priority_queue <int, vector <int>, cmp> Heap;
for (int i=2;i<=n;++i) d[i]=inf;
d[sursa]=0;
Heap.push(sursa);
while(!Heap.empty()){
int from=Heap.top();
Heap.pop();
vector < pair <int,int> >::iterator it;
for (it=G[from].begin();it!=G[from].end();++it){
int to=it->nod;
if (d[to]> d[from] + it->weight)
{
d[to]=d[from]+it->weight;
Heap.push(to);
}
}
}
for (int i=2;i<=n;++i) cout<<d[i]<<" ";
}
};
undirected_graf Graf;
int main(void){
ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");
cin>>n>>m;
for (int i=1;i<=m;++i){
cin>>from>>to>>cost;
if (from!=to) Graf.add(from,to,cost);
}
Graf.Dijkstra(1);
return 0;
}