#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
// Declaring functions
void mincammino(int N, int M, vector<int> X, vector<int> Y, vector<int> P, vector<int> &D);
struct struttura{
vector<pair<int, int>> collegamenti;
int entrata = 0;
bool passato = false;
bool collegatoazero = false;
};
void mincammino(int N, int M, vector<int> X, vector<int> Y, vector<int> P, vector<int> &D) {
vector<struttura> nodo(N);
pair<int, int> a;
nodo[0].collegatoazero = true;
for(int i = 0; i < M; i++){
nodo[Y[i]].entrata++;
a.first = Y[i];
a.second = P[i];
nodo[X[i]].collegamenti.push_back(a);
if(nodo[X[i]].collegatoazero) nodo[Y[i]].collegatoazero;
}
int posizionetop = 0;
D[0] = 0;
while(posizionetop < N){
for(int i = 0; i < N; i++){
if(nodo[i].entrata == 0){
for(int l = 0; l < nodo[i].collegamenti.size(); l++){
//cout << i << " : i " << D[i] << " : COSTO I " << nodo[i].collegamenti[l].first << ": PEKO PAIN " << D[i] + nodo[i].collegamenti[l].second << " : COSTO"<< endl;
nodo[nodo[i].collegamenti[l].first].entrata--;
if(nodo[i].collegatoazero && (nodo[nodo[i].collegamenti[l].first].passato == false || D[nodo[i].collegamenti[l].first] > D[i] + nodo[i].collegamenti[l].second)){
D[nodo[i].collegamenti[l].first]= D[i] + nodo[i].collegamenti[l].second;
nodo[nodo[i].collegamenti[l].first].passato = true;
nodo[nodo[i].collegamenti[l].first].collegatoazero = true;
}
}
nodo[i].entrata = -1;
break;
}
}
posizionetop++;
}
/*for(int i = 0; i < N; i++){
cout << nodo[i].passato << endl;
}*/
D[0] = 0;
for(int i = 1; i < N; i++) if(nodo[i].passato == false) D[i] = -1;
}
int main() {
ios::sync_with_stdio(false);
// Uncomment the following lines if you want to read/write from files
// ifstream cin("input.txt");
// ofstream cout("output.txt");
// Reading input
int N, M;
cin >> N >> M;
vector<int> X(M), Y(M), P(M), D(N);
for (int i = 0; i < M; i++) {
cin >> X[i] >> Y[i] >> P[i];
}
// Calling functions
mincammino(N, M, move(X), move(Y), move(P), D);
// Writing output
for (int i = 0; i < N; i++) {
cout << D[i] << ' ';
}
cout << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIERlY2xhcmluZyBmdW5jdGlvbnMKdm9pZCBtaW5jYW1taW5vKGludCBOLCBpbnQgTSwgdmVjdG9yPGludD4gWCwgdmVjdG9yPGludD4gWSwgdmVjdG9yPGludD4gUCwgdmVjdG9yPGludD4gJkQpOwoKc3RydWN0IHN0cnV0dHVyYXsKCXZlY3RvcjxwYWlyPGludCwgaW50Pj4gY29sbGVnYW1lbnRpOyAKCWludCBlbnRyYXRhID0gMDsgCglib29sIHBhc3NhdG8gPSBmYWxzZTsgCglib29sIGNvbGxlZ2F0b2F6ZXJvID0gZmFsc2U7IAp9OyAKCnZvaWQgbWluY2FtbWlubyhpbnQgTiwgaW50IE0sIHZlY3RvcjxpbnQ+IFgsIHZlY3RvcjxpbnQ+IFksIHZlY3RvcjxpbnQ+IFAsIHZlY3RvcjxpbnQ+ICZEKSB7Cgl2ZWN0b3I8c3RydXR0dXJhPiBub2RvKE4pOwoJcGFpcjxpbnQsIGludD4gYTsgCglub2RvWzBdLmNvbGxlZ2F0b2F6ZXJvID0gdHJ1ZTsgCglmb3IoaW50IGkgPSAwOyBpIDwgTTsgaSsrKXsKCQlub2RvW1lbaV1dLmVudHJhdGErKzsgCgkJYS5maXJzdCA9IFlbaV07IAoJCWEuc2Vjb25kID0gUFtpXTsgIAoJCW5vZG9bWFtpXV0uY29sbGVnYW1lbnRpLnB1c2hfYmFjayhhKTsgCgkJaWYobm9kb1tYW2ldXS5jb2xsZWdhdG9hemVybykgbm9kb1tZW2ldXS5jb2xsZWdhdG9hemVybzsgCgl9CgkKCWludCBwb3NpemlvbmV0b3AgPSAwOyAKCURbMF0gPSAwOyAKCXdoaWxlKHBvc2l6aW9uZXRvcCA8IE4pewoJCQoJCWZvcihpbnQgaSA9IDA7IGkgPCBOOyBpKyspewoJCQlpZihub2RvW2ldLmVudHJhdGEgPT0gMCl7CgkJCQlmb3IoaW50IGwgPSAwOyBsIDwgbm9kb1tpXS5jb2xsZWdhbWVudGkuc2l6ZSgpOyBsKyspewoJCQkJCS8vY291dCA8PCBpICA8PCAiIDogaSAiIDw8IERbaV0gPDwgIiA6IENPU1RPIEkgIiA8PCBub2RvW2ldLmNvbGxlZ2FtZW50aVtsXS5maXJzdCA8PCAiOiBQRUtPIFBBSU4gIiA8PCBEW2ldICsgbm9kb1tpXS5jb2xsZWdhbWVudGlbbF0uc2Vjb25kIDw8ICIgOiBDT1NUTyI8PCBlbmRsOwoJCQkJCW5vZG9bbm9kb1tpXS5jb2xsZWdhbWVudGlbbF0uZmlyc3RdLmVudHJhdGEtLTsKCQkJCQlpZihub2RvW2ldLmNvbGxlZ2F0b2F6ZXJvICYmIChub2RvW25vZG9baV0uY29sbGVnYW1lbnRpW2xdLmZpcnN0XS5wYXNzYXRvID09IGZhbHNlIHx8IERbbm9kb1tpXS5jb2xsZWdhbWVudGlbbF0uZmlyc3RdID4gRFtpXSArIG5vZG9baV0uY29sbGVnYW1lbnRpW2xdLnNlY29uZCkpewoJCQkJCQlEW25vZG9baV0uY29sbGVnYW1lbnRpW2xdLmZpcnN0XT0gRFtpXSArIG5vZG9baV0uY29sbGVnYW1lbnRpW2xdLnNlY29uZDsgCgkJCQkJCW5vZG9bbm9kb1tpXS5jb2xsZWdhbWVudGlbbF0uZmlyc3RdLnBhc3NhdG8gPSB0cnVlOyAKCQkJCQkJbm9kb1tub2RvW2ldLmNvbGxlZ2FtZW50aVtsXS5maXJzdF0uY29sbGVnYXRvYXplcm8gPSB0cnVlOyAKCQkJCQl9CgkJCQl9IAoJCQkJbm9kb1tpXS5lbnRyYXRhID0gLTE7IAoJCQkJYnJlYWs7IAoJCQl9CgkJfQoJCXBvc2l6aW9uZXRvcCsrOyAKCX0KCS8qZm9yKGludCBpID0gMDsgaSA8IE47IGkrKyl7CgkJY291dCA8PCBub2RvW2ldLnBhc3NhdG8gPDwgZW5kbDsgCgl9Ki8KCURbMF0gPSAwOyAKCWZvcihpbnQgaSA9IDE7IGkgPCBOOyBpKyspIGlmKG5vZG9baV0ucGFzc2F0byA9PSBmYWxzZSkgRFtpXSA9IC0xOyAKfQogIAppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKCiAgICAvLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyBpZiB5b3Ugd2FudCB0byByZWFkL3dyaXRlIGZyb20gZmlsZXMKICAgIC8vIGlmc3RyZWFtIGNpbigiaW5wdXQudHh0Iik7CiAgICAvLyBvZnN0cmVhbSBjb3V0KCJvdXRwdXQudHh0Iik7CgogICAgLy8gUmVhZGluZyBpbnB1dAogICAgaW50IE4sIE07CiAgICBjaW4gPj4gTiA+PiBNOwoKICAgIHZlY3RvcjxpbnQ+IFgoTSksIFkoTSksIFAoTSksIEQoTik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IE07IGkrKykgewogICAgICAgIGNpbiA+PiBYW2ldID4+IFlbaV0gPj4gUFtpXTsKICAgIH0KCiAgICAvLyBDYWxsaW5nIGZ1bmN0aW9ucwogICAgbWluY2FtbWlubyhOLCBNLCBtb3ZlKFgpLCBtb3ZlKFkpLCBtb3ZlKFApLCBEKTsKCiAgICAvLyBXcml0aW5nIG91dHB1dAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBjb3V0IDw8IERbaV0gPDwgJyAnOwogICAgfQogICAgY291dCA8PCAnXG4nOwoKICAgCn0K