#ifdef DEBUG_IS_VALID #define DEB 1 #define _LIBCPP_DEBUG 0 #else #define DEB 0 #define NDEBUG #endif #include "bits/stdc++.h" #define ALL(g) (g).begin(),(g).end() #define REP(i, x, n) for(int i = x; i < n; i++) #define rep(i,n) REP(i,0,n) #define RREP(i, x, n) for(int i = x; i >= n; i--) #define rrep(i, n) RREP(i,n,0) #define pb push_back #pragma GCC optimize ("-O3") using namespace std; #define DUMPOUT cout #define dump(...) if(DEB) DUMPOUT<<" "<<#__VA_ARGS__<<" :["<<__LINE__<<":"<<__FUNCTION__<<"]"<ostream& operator << (ostream& os, pair p){cout << "(" << p.first << ", " << p.second << ")"; return os;} templateostream& operator << (ostream& os, vector& vec) { os << "{"; for (int i = 0; iostream& operator << (ostream& os, set& st){cout << "{"; for(auto itr = st.begin(); itr != st.end(); itr++) cout << *itr << (next(itr)!=st.end() ? ", " : ""); cout << "}"; return os;} templateostream& operator << (ostream& os, map mp){cout << "{"; for(auto itr = mp.begin(); itr != mp.end(); itr++) cout << "(" << (itr->first) << ", " << (itr->second) << ")" << (next(itr)!=mp.end() ? "," : ""); cout << "}"; return os; } void dump_func(){DUMPOUT << endl;} template void dump_func(Head&& head, Tail&&... tail){ DUMPOUT << head; if (sizeof...(Tail) == 0) { DUMPOUT << " "; } else { DUMPOUT << ", "; } dump_func(std::move(tail)...);} template inline bool chmax(T& a,T const& b){if(a>=b) return false; a=b; return true;} template inline bool chmin(T& a,T const& b){if(a<=b) return false; a=b; return true;} void _main(); int main(){ cin.tie(0); ios::sync_with_stdio(false); _main(); return 0;} using ll = long long; using P = pair; using Pl = pair; using vi = vector; using vvi = vector; using vl = vector; using vvl = vector; const int mod=1e9+7,INF=1<<29; const double EPS=1e-5,PI=3.1415926535897932384626; const ll lmod = 1e9+7,LINF=1LL<<59; using vd = vector; using vvd = vector; namespace sub { template constexpr typename std::enable_if::value, T>::type inf_sub() { return std::numeric_limits::max() / 2 - 1000; } template constexpr typename std::enable_if::value, T>::type inf_sub() { return std::min(std::numeric_limits::max() / 2 - 1000, T(1e50)); } } // namespace sub /// @return Returns a large finite value representable by the numeric type T. /// @note It is guaranteed that the return values is strictly less than std::numeric_limits::max() / 2. template constexpr T inf() { static_assert(std::is_arithmetic::value, "T must be arithmetic value"); return sub::inf_sub(); } using Cost = ll; using Node = int; struct Edge{ Cost cost; Node to; Edge(Cost cost,Node to) :cost(cost),to(to){} }; ostream& operator << (ostream& os, Edge& e) { cout << "(" << e.cost << "," << e.to << ") "; return os; } using Graph = vector>; vector dijkstra (Graph &graph, Node start, Cost zero = 0LL) { using Pcn = pair; priority_queue,greater> que; vector dist(graph.size(),inf()); dist[start] = zero; que.push(Pcn(zero,start)); while(!que.empty()){ Pcn p = que.top(); que.pop(); Node v = p.second; //行き先 if(dist[v] < p.first) continue; for(Edge e : graph[v]){ if(dist[v]+e.cost < dist[e.to]){ dist[e.to] = dist[v]+e.cost; que.push(Pcn(dist[e.to],e.to)); } } } return dist; } vector dijkstra2 (Graph &graph,vector &dist0, Node start, Cost zero = 0LL) { using Pcn = pair; priority_queue,greater> que; vector dist(graph.size(),inf()); int N = graph.size(); dist[0] = 0; rep(i,N) for(auto&& e:graph[i]){ que.push(Pcn(dist0[i],e.to)); chmin(dist[e.to],dist0[i]); } while(!que.empty()){ Pcn p = que.top(); que.pop(); Node v = p.second; //行き先 dump(v,p.first); if(dist[v] < p.first) continue; dump(v,p.first); for(Edge e : graph[v]){ if(dist[v]+e.cost < dist[e.to]){ dist[e.to] = dist[v]+e.cost; que.push(Pcn(dist[e.to],e.to)); } } } dump(dist); return dist; } void add_edge(Graph& g,int u,int v,ll c){ g[u].pb(Edge(c,v)); g[v].pb(Edge(c,u)); } void _main(){ int N; cin >> N ; int M; cin >> M; Graph g(N); rep(i,M){ int u,v; ll c; cin >> u >> v >> c ; u--; v--; add_edge(g,u,v,c); } dump(g); auto dist = dijkstra(g,0); dump(dist); auto dist2 = dijkstra2(g,dist,0); rep(i,N) cout << dist[i] + dist2[i] << endl; }