#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
// ---------------------- Graph Input ----------------------
void takeInput(int &N, int &E, vector<vector<pair<int,int>>> &graph) {
cin >> N >> E;
graph.assign(N + 1, {});
for (int i = 0; i < E; i++) {
int u, v, w;
cin >> u >> v >> w;
graph[u].push_back({v, w});
graph[v].push_back({u, w}); // remove if directed
}
}
// ---------------------- Dijkstra Algorithm ----------------------
void dijkstra(int source,
vector<vector<pair<int,int>>> &graph,
vector<int> &dist,
vector<int> &parent) {
int n = graph.size();
dist.assign(n, INF);
parent.assign(n, -1);
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<>> pq;
dist[source] = 0;
pq.push({0, source});
while (!pq.empty()) {
auto [currentDist, u] = pq.top();
pq.pop();
if (currentDist > dist[u]) continue;
for (auto [v, weight] : graph[u]) {
if (dist[u] + weight < dist[v]) {
dist[v] = dist[u] + weight;
parent[v] = u;
pq.push({dist[v], v});
}
}
}
}
// ---------------------- Path Printing ----------------------
void printPath(int node, vector<int> &parent) {
if (node == -1) return;
printPath(parent[node], parent);
cout << node;
if (parent[node] != -1) cout << " -> ";
}
// ---------------------- Output ----------------------
void printResult(int N, vector<int> &dist, vector<int> &parent) {
for (int i = 1; i <= N; i++) {
cout << "Customer " << i << ": ";
if (dist[i] == INF) {
cout << "Not reachable\n";
} else {
cout << "Minimum Distance = " << dist[i] << ", Path = ";
printPath(i, parent);
cout << "\n";
}
}
}
// ---------------------- Main ----------------------
int main() {
int N, E;
vector<vector<pair<int,int>>> graph;
// Step 1: Input
takeInput(N, E, graph);
// Step 2: Dijkstra
vector<int> dist, parent;
dijkstra(0, graph, dist, parent); // source = 0
// Step 3: Output
printResult(N, dist, parent);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgSU5GID0gMWU5OwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHcmFwaCBJbnB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgdGFrZUlucHV0KGludCAmTiwgaW50ICZFLCB2ZWN0b3I8dmVjdG9yPHBhaXI8aW50LGludD4+PiAmZ3JhcGgpIHsKICAgIGNpbiA+PiBOID4+IEU7CgogICAgZ3JhcGguYXNzaWduKE4gKyAxLCB7fSk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFOyBpKyspIHsKICAgICAgICBpbnQgdSwgdiwgdzsKICAgICAgICBjaW4gPj4gdSA+PiB2ID4+IHc7CgogICAgICAgIGdyYXBoW3VdLnB1c2hfYmFjayh7diwgd30pOwogICAgICAgIGdyYXBoW3ZdLnB1c2hfYmFjayh7dSwgd30pOyAvLyByZW1vdmUgaWYgZGlyZWN0ZWQKICAgIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEaWprc3RyYSBBbGdvcml0aG0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIGRpamtzdHJhKGludCBzb3VyY2UsCiAgICAgICAgICAgICAgdmVjdG9yPHZlY3RvcjxwYWlyPGludCxpbnQ+Pj4gJmdyYXBoLAogICAgICAgICAgICAgIHZlY3RvcjxpbnQ+ICZkaXN0LAogICAgICAgICAgICAgIHZlY3RvcjxpbnQ+ICZwYXJlbnQpIHsKCiAgICBpbnQgbiA9IGdyYXBoLnNpemUoKTsKICAgIGRpc3QuYXNzaWduKG4sIElORik7CiAgICBwYXJlbnQuYXNzaWduKG4sIC0xKTsKCiAgICBwcmlvcml0eV9xdWV1ZTxwYWlyPGludCxpbnQ+LCB2ZWN0b3I8cGFpcjxpbnQsaW50Pj4sIGdyZWF0ZXI8Pj4gcHE7CgogICAgZGlzdFtzb3VyY2VdID0gMDsKICAgIHBxLnB1c2goezAsIHNvdXJjZX0pOwoKICAgIHdoaWxlICghcHEuZW1wdHkoKSkgewogICAgICAgIGF1dG8gW2N1cnJlbnREaXN0LCB1XSA9IHBxLnRvcCgpOwogICAgICAgIHBxLnBvcCgpOwoKICAgICAgICBpZiAoY3VycmVudERpc3QgPiBkaXN0W3VdKSBjb250aW51ZTsKCiAgICAgICAgZm9yIChhdXRvIFt2LCB3ZWlnaHRdIDogZ3JhcGhbdV0pIHsKICAgICAgICAgICAgaWYgKGRpc3RbdV0gKyB3ZWlnaHQgPCBkaXN0W3ZdKSB7CiAgICAgICAgICAgICAgICBkaXN0W3ZdID0gZGlzdFt1XSArIHdlaWdodDsKICAgICAgICAgICAgICAgIHBhcmVudFt2XSA9IHU7CiAgICAgICAgICAgICAgICBwcS5wdXNoKHtkaXN0W3ZdLCB2fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGF0aCBQcmludGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgcHJpbnRQYXRoKGludCBub2RlLCB2ZWN0b3I8aW50PiAmcGFyZW50KSB7CiAgICBpZiAobm9kZSA9PSAtMSkgcmV0dXJuOwogICAgcHJpbnRQYXRoKHBhcmVudFtub2RlXSwgcGFyZW50KTsKICAgIGNvdXQgPDwgbm9kZTsKICAgIGlmIChwYXJlbnRbbm9kZV0gIT0gLTEpIGNvdXQgPDwgIiAtPiAiOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgcHJpbnRSZXN1bHQoaW50IE4sIHZlY3RvcjxpbnQ+ICZkaXN0LCB2ZWN0b3I8aW50PiAmcGFyZW50KSB7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBOOyBpKyspIHsKICAgICAgICBjb3V0IDw8ICJDdXN0b21lciAiIDw8IGkgPDwgIjogIjsKCiAgICAgICAgaWYgKGRpc3RbaV0gPT0gSU5GKSB7CiAgICAgICAgICAgIGNvdXQgPDwgIk5vdCByZWFjaGFibGVcbiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY291dCA8PCAiTWluaW11bSBEaXN0YW5jZSA9ICIgPDwgZGlzdFtpXSA8PCAiLCBQYXRoID0gIjsKICAgICAgICAgICAgcHJpbnRQYXRoKGksIHBhcmVudCk7CiAgICAgICAgICAgIGNvdXQgPDwgIlxuIjsKICAgICAgICB9CiAgICB9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFpbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBtYWluKCkgewogICAgaW50IE4sIEU7CiAgICB2ZWN0b3I8dmVjdG9yPHBhaXI8aW50LGludD4+PiBncmFwaDsKCiAgICAvLyBTdGVwIDE6IElucHV0CiAgICB0YWtlSW5wdXQoTiwgRSwgZ3JhcGgpOwoKICAgIC8vIFN0ZXAgMjogRGlqa3N0cmEKICAgIHZlY3RvcjxpbnQ+IGRpc3QsIHBhcmVudDsKICAgIGRpamtzdHJhKDAsIGdyYXBoLCBkaXN0LCBwYXJlbnQpOyAvLyBzb3VyY2UgPSAwCgogICAgLy8gU3RlcCAzOiBPdXRwdXQKICAgIHByaW50UmVzdWx0KE4sIGRpc3QsIHBhcmVudCk7CgogICAgcmV0dXJuIDA7Cn0=