#include<bits/stdc++.h>
using namespace std;
const int SIZE = 100;
vector < pair < int , int > > v [SIZE];
int dist [SIZE];
bool vis [SIZE];
int V,E;
void dijkstra(){
// set the vertices distances as infinity
for(int i=0;i< SIZE; i++)
dist[i]=1e9;
// set all vertex as unvisited
memset(vis, false , sizeof vis);
// source distance to itself equals to 0
dist[1] = 0;
// priority_queue to do the job
priority_queue < pair < int , int >,vector<pair<int,int>>,greater<pair<int,int>> > pq;
// insert the source node with distance 0
pq.push({0 , 1});
while(!pq.empty()){
pair <int , int> p = pq.top(); // pop the vertex with the minimum distance
pq.pop();
int x = p.second; // x is the current vertex
if( vis[x] ) // check if the popped vertex is
continue; // visited before
vis[x] = true;
for(int i = 0; i < v[x].size(); i++){
int e = v[x][i].first; int w = v[x][i].second;
if(dist[x] + w < dist[e] ){ // check if the next vertex distance could be minimized
dist[e] = dist[x] + w;
pq.push({dist[e], e} ); // insert the next vertex with the updated distance
}
}
}
for(int i=1;i<=V;i++)
cout<<dist[i]<<" ";
}
int main(){
cin>>V>>E;
for(int i=0;i<E;i++){
int x,y,weight ;
cin>>x>>y>>weight ;
v[x].push_back({y,weight}) ;
}
dijkstra();
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IFNJWkUgPSAxMDA7Cgp2ZWN0b3IgPCBwYWlyIDwgaW50ICwgaW50ID4gPiB2IFtTSVpFXTsgIAppbnQgZGlzdCBbU0laRV07CmJvb2wgdmlzIFtTSVpFXTsKaW50IFYsRTsKCnZvaWQgZGlqa3N0cmEoKXsKICAgIAogICAgLy8gc2V0IHRoZSB2ZXJ0aWNlcyBkaXN0YW5jZXMgYXMgaW5maW5pdHkKICAgIGZvcihpbnQgaT0wO2k8IFNJWkU7IGkrKykKICAgICAgICBkaXN0W2ldPTFlOTsKICAgICAgICAKICAgIC8vIHNldCBhbGwgdmVydGV4IGFzIHVudmlzaXRlZAogICAgbWVtc2V0KHZpcywgZmFsc2UgLCBzaXplb2YgdmlzKTsgICAgCiAgICAKICAgIC8vIHNvdXJjZSBkaXN0YW5jZSB0byBpdHNlbGYgZXF1YWxzIHRvIDAKICAgIGRpc3RbMV0gPSAwOwogICAgCiAgICAvLyBwcmlvcml0eV9xdWV1ZSB0byBkbyB0aGUgam9iCiAgICBwcmlvcml0eV9xdWV1ZSA8IHBhaXIgPCBpbnQgLCBpbnQgPix2ZWN0b3I8cGFpcjxpbnQsaW50Pj4sZ3JlYXRlcjxwYWlyPGludCxpbnQ+PiA+IHBxOyAKICAgIAogICAgLy8gaW5zZXJ0IHRoZSBzb3VyY2Ugbm9kZSB3aXRoIGRpc3RhbmNlIDAKICAgIHBxLnB1c2goezAgLCAxfSk7ICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgIHdoaWxlKCFwcS5lbXB0eSgpKXsKCiAgICAgICAgcGFpciA8aW50ICwgaW50PiBwID0gcHEudG9wKCk7ICAgICAgICAvLyBwb3AgdGhlIHZlcnRleCB3aXRoIHRoZSBtaW5pbXVtICAgICAgICAgIGRpc3RhbmNlCiAgICAgICAgcHEucG9wKCk7CgogICAgICAgIGludCB4ID0gcC5zZWNvbmQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyB4IGlzIHRoZSBjdXJyZW50IHZlcnRleAogICAgICAgIAogICAgICAgIGlmKCB2aXNbeF0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgcG9wcGVkIHZlcnRleCBpcwogICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2aXNpdGVkIGJlZm9yZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICB2aXNbeF0gPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgdlt4XS5zaXplKCk7IGkrKyl7CiAgICAgICAgICAgIGludCBlID0gdlt4XVtpXS5maXJzdDsgaW50IHcgPSB2W3hdW2ldLnNlY29uZDsKICAgICAgICAgICAgaWYoZGlzdFt4XSArIHcgPCBkaXN0W2VdICApeyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBuZXh0IHZlcnRleCAgICAgICAgICAgICBkaXN0YW5jZSBjb3VsZCBiZSBtaW5pbWl6ZWQKICAgICAgICAgICAgICAgIGRpc3RbZV0gPSBkaXN0W3hdICsgdzsKICAgICAgICAgICAgICAgIHBxLnB1c2goe2Rpc3RbZV0sICBlfSApOyAgICAgICAgICAgLy8gaW5zZXJ0IHRoZSBuZXh0IHZlcnRleCAgICAgICAgICAgICAgIHdpdGggdGhlIHVwZGF0ZWQgZGlzdGFuY2UKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZvcihpbnQgaT0xO2k8PVY7aSsrKQogICAgICAgIGNvdXQ8PGRpc3RbaV08PCIgIjsKfQoKaW50IG1haW4oKXsKICAgIAogICAgY2luPj5WPj5FOwogICAgZm9yKGludCBpPTA7aTxFO2krKyl7CiAgICAgICAgaW50IHgseSx3ZWlnaHQgOwogICAgICAgIGNpbj4+eD4+eT4+d2VpZ2h0IDsKICAgICAgICB2W3hdLnB1c2hfYmFjayh7eSx3ZWlnaHR9KSA7CiAgICB9CiAgICBkaWprc3RyYSgpOwogICAgCiAgICByZXR1cm4gMDsKfQ==