#include<fstream>
#include<string.h>
#include<ctype.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<unordered_map>
#include<array>
#include<deque>
#include<math.h>
#include<unordered_set>
#include<queue>
#include<set>
#include<iomanip>
#include<bitset>
using namespace std;
int n, m,i,j,k,x,y,cost[50500],crcost;
vector<pair<int, int>>v[50500];
pair<int, int>el;
priority_queue<pair<int, int>>que;
int main()
{
//ifstream f("file.in");
//ofstream g("file.out");
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
f >> n >> m;
for (i = 1; i <= m; i++)
{
f >> x >> y >> crcost;
v[x].push_back({ y,crcost });
v[y].push_back({ x,crcost });
}
for (i = 2; i <= n; i++)
cost[i] = 1 << 30;
que.emplace(make_pair(1,0));
while (que.size() != 0)
{
el = que.top();
que.pop();
for (auto it = v[el.first].begin(); it != v[el.first].end(); it++)
if (cost[it->first] > cost[el.first] + it->second)
{
//if (cost[it->first] ==1<<30)
cost[it->first] = cost[el.first] + it->second;
que.emplace(make_pair(it->first, it->second));
}
}
for (i = 2; i <= n; i++)
g << cost[i] << ' ';
return 0;
}