#include <cstdio>
#include <iostream>
#include <string.h>
using namespace std;
const int INF = (1<<31 - 1);
#define MAX 100
int w[MAX][MAX]; //邻接矩阵
int n , m; // n:节点个数, m: 边的个数
void dijkstra() //经典的dijkstra算法不解释
{
int v[MAX],d[MAX];
memset(v,0,sizeof(v));
for(int i = 0; i < n; ++i)
{
d[i] = (i == 0 ? 0 : INF); //初始化, 0 为起点(根据不同的起点设置)
}
for(int i = 0; i < n; ++i)
{
int x , min = INF;
for(int y = 0; y < n; ++y)
{
if(!v[y] && d[y] <= min)
{
min = d[x=y];
}
}
v[x] = 1;
for(int y = 0; y < n; ++y)
{
if(d[y] > d[x] + w[x][y]) //边(x y)的松弛操作
{
d[y] = d[x] + w[x][y];
}
}
}
for(int i = 0; i < n; ++i)
{
cout << d[i] << endl;
}
}
int main()
{
// freopen("test.txt","r",stdin);
int u,v,ww;
cin >> n >> m;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
if(i == j)
w[i][j] = 0;
else
w[i][j] = INF;
}
}
for(int i = 0; i < m; ++i)
{
cin >> u >> v >> ww;
w[u][v] = w[v][u] = ww;
}
dijkstra();
return 0;
}