#include <iostream>
#include <vector>
#include <climits>
#include <queue>
using namespace std;

void mincammino(int N, int M, vector<int> X, vector<int> Y, vector<int> P, vector<long long>& D) {
    vector<vector<pair<int, int>>> adj(N);
    for(int i=0; i<M; i++){
        adj[X[i]].push_back({Y[i], P[i]}); //nodoArrivo, costo
    }
    fill(D.begin(), D.end(), -1);
    D[0] = 0;
    vector<bool> vis(N, false);
    priority_queue<pair<long long, int>> pq; //-dst, nodo
    pq.push({0, 0});
    while(!pq.empty()){
        auto [dst, nodo] = pq.top();
        pq.pop();

        if(vis[nodo]) continue;
        vis[nodo] = true;
        
        for(auto [nodoArrivo, costo] : adj[nodo]){
            if(D[nodoArrivo] > D[nodo]+costo || D[nodoArrivo]==-1){
                D[nodoArrivo] = D[nodo]+costo;
                pq.push({-D[nodoArrivo], nodoArrivo});
            }
        }
    }
}
