#include <bits/stdc++.h>
#define INF 10000000
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
typedef pair <int, int> iPair;
struct Neighbour {
int node, cost;
};
vector <vector <Neighbour>> G;
vector <int> C;
int n, m;
void Dijkstra(int start) {
vector <bool> used(n + 1, false);
C = vector <int> (n + 1, INF);
priority_queue <iPair, vector <iPair>, greater <iPair>> pq;
pq.push(make_pair(start, 0));
C[start] = 0;
while(!pq.empty()) {
int Node = pq.top().first;
pq.pop();
for(auto x : G[Node])
if(!used[x.node] && C[x.node] > C[Node] + x.cost) {
C[x.node] = C[Node] + x.cost;
pq.push(make_pair(x.node, C[x.node]));
}
}
}
int main() {
fin >> n >> m;
G.resize(n + 1);
for(int i = 1; i <= m; i ++) {
int x, y, c; fin >> x >> y >> c;
G[x].push_back({y, c});
}
Dijkstra(1);
for(int i = 2; i <= n; i ++)
fout << (C[i] != INF ? C[i] : 0) << ' ';
return 0;
}