#include <vector>
#include <algorithm>
#include <queue>

using namespace std;
using ll = long long;

void mincammino(int N, int M, vector<int> X, vector<int> Y, vector<int> P, vector<long long>& D) {
    fill(D.begin(), D.end(), -1);
    D[0] = 0;
    vector<vector<pair<int, ll>>> adj(N);
    for (int i = 0; i < M; i++) adj[X[i]].emplace_back(Y[i], P[i]);
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;
    vector<bool> v(N, false);
    pq.push({0, 0});
    while (!pq.empty()) {
        auto [dist, n] = pq.top();
        pq.pop();

        if (v[n]) continue;
        v[n] = true;

        for (auto [node, edge] : adj[n]) {
            if (D[node] == -1 || D[n] + edge < D[node]) {
                D[node] = D[n] + edge;
                pq.push({D[node], node});
            }
        }
    }
    return;
}
