#include using namespace std; //repetition #define FOR(i,a,b) for(ll i=(a);i<(b);++i) #define rep(i, n) for(ll i = 0; i < (ll)(n); i++) //container util #define all(x) (x).begin(),(x).end() //typedef typedef long long ll; typedef vector VI; typedef vector VVI; typedef vector VLL; typedef vector VVLL; typedef vector VS; typedef pair PII; typedef pair PLL; //const value //const ll MOD = 1e9 + 7; //const int dx[] = {0,1,0,-1};//{0,0,1,1,1,-1,-1,-1}; //const int dy[] = {1,0,-1,0};//{1,-1,0,1,-1,0,1,-1}; //conversion inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;} inline ll toLL(string s) {ll v; istringstream sin(s);sin>>v;return v;} template inline string toString(T x) {ostringstream sout;sout<>& edge){ rep(i,n) dist[i] = INF; priority_queue< PLL, vector, greater> que; que.push({0,0}); dist[0] = 0; while(que.empty() == false){ PLL p = que.top(); que.pop(); ll c = p.first; ll cdist = p.second; if(dist[c] < cdist) continue; for(PLL next :edge[c]){ if(dist[next.first] >= next.second + cdist){ dist[next.first] = next.second + cdist; que.push({next.first,dist[next.first]}); } } } } typedef tuple State; void dijkstra_skip(int n, vector>& edge){ rep(j,2)rep(i,n) distSkip[i][j] = INF; priority_queue< State, vector, greater> que; que.push({0,0,0}); distSkip[0][0] = 0; distSkip[0][1] = 0; while(que.empty() == false){ State p = que.top(); que.pop(); ll c = get<0>(p); ll cdist = get<1>(p); ll flag = get<2>(p); if(distSkip[c][flag] < cdist) continue; for(PLL next :edge[c]){ // not skip if(distSkip[next.first][flag] >= next.second + cdist){ distSkip[next.first][flag] = next.second + cdist; que.push({next.first,distSkip[next.first][flag], flag}); } // skip if(flag == 0 && distSkip[next.first][1] >= cdist){ distSkip[next.first][1] = cdist; que.push({next.first,distSkip[next.first][1], 1}); } } } } int main(){ ios::sync_with_stdio(false); cin.tie(0); int n,m; cin >> n >> m; vector> edge(n); rep(i,m){ ll a,b,c; cin >> a >> b >> c; a--,b--; edge[a].push_back({b,c}); edge[b].push_back({a,c}); } dijkstra(n,edge); dijkstra_skip(n,edge); rep(i,n){ cout << distSkip[i][1] + dist[i] << endl; } return 0; }