#include <bits/stdc++.h>
using namespace std;

void mincammino(int N, int M, vector<int> X, vector<int> Y, vector<int> P, vector<long long>& D) {
    // Nodi con le distanze
    vector node(N, numeric_limits<int>::max());
    node[0] = 0;

    // Bool dei nodi visitati
    vector visited(N, false);

    // Adiacenze
    vector adj(N, vector<pair<int, int>>(0));

    // Costruiamo le adiacenze dirette e pesate
    for (int m = 0; m < M; ++m) {
        adj[X[m]].emplace_back(Y[m], P[m]);
    }

    // Pq per dijkstra [DIST, INDEX]
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
    pq.emplace(0, 0);

    // Continua per svuotare la queue
    while (!pq.empty()) {
        auto [dist, id] = pq.top();
        pq.pop();

        if (visited[id]) continue;

        // Altrimenti mettiamo nella queue gli altri nodi
        for (auto [y, p] : adj[id]) {
            if (node[y] > dist + p) {
                node[y] = dist + p;
                pq.emplace(node[y], y);
            }
        }

        // Marka come visitato
        visited[id] = true;
    }

    // Carichiamo in D
    for (int i = 0; i < N; ++i) {
        D[i] = !visited[i] ? -1 : node[i];
    }
}
