#include #include #include #define INF 1e18 using namespace std; struct edge { int next; ll weight; }; using ll = long long; using item = pair; using graph = vector>; vector min_ways(graph & g, int start) { priority_queue q; // мин. точка из рассматриваемых vector visited(g.size(), false); // посещенные точки vector mins(g.size(), INF); // мин. путь к точкам // инициализация стартового состояния mins[start] = 0; q.push({0, start}); while(!q.empty()) { int ind = q.top().second; // рассматриваемая точка ll curr_min = -q.top().first; // мин. путь к этой точке q.pop(); if(visited[ind]) continue; // если точка уже посещена - пропускаем visited[ind] = true; // помечаем посещенной for(edge v : g[ind]) { ll new_weight = curr_min + v.weight; if(new_weight < mins[v.next]) { mins[v.next] = new_weight; q.push({-new_weight, v.next}); } } } return mins; } int main() { int n, m, s, u, v, w; cin >> n >> m >> s; s--; graph g(n); while(m--) { cin >> u >> v >> w; u--; v--; g[u].push_back({.next = v, .weight = w}); g[v].push_back({.next = u, .weight = w}); } for(int64_t el : min_ways(g, s)) cout << (el == INF ? -1 : el) << " "; }