#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
void dijkstra(const vector<vector<pair<long long,long long>>> &adj, long long start, vector<long long> &dist) {
long long n = adj.size();
dist.assign(n, LLONG_MAX);
vector<bool> processed(n, false);
priority_queue<pair<long long,long long>, vector<pair<long long,long long>>, greater<pair<long long,long long>>> pq;
dist[start] = 0;
pq.push({0, start});
while (!pq.empty()) {
long long a = pq.top().second;
pq.pop();
if (processed[a]) continue;
processed[a] = true;
for (auto [b, w] : adj[a]) {
if (dist[a] + w < dist[b]) {
dist[b] = dist[a] + w;
pq.push({dist[b], b});
}
}
}
}
long long main() {
long long n, m;
cin >> n >> m;
vector<vector<pair<long long,long long>>> adj(n);
for (long long i = 0; i < m; i++) {
long long a, b, w;
cin >> a >> b >> w;
a--; b--;
adj[a].push_back({b, w});
}
vector<long long> dist;
dijkstra(adj, 0, dist);
for (long long i = 0; i < n; i++) {
cout << dist[i] << " ";
}
}