#include <vector>
#include <algorithm>
#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,long long int>>> grafo(N);
    for(int i=0;i<M;i++){
        grafo[X[i]].push_back({Y[i],P[i]});
    }
    priority_queue<pair<long long int,int>, vector<pair<long long int,int>>, greater<pair<long long int,int>>> next;
    next.push({0,0});
    fill(D.begin(), D.end(), 1e18);
    D[0]=0;

    while(!next.empty()){
        int from=next.top().second;
        long long int w=next.top().first;
        if(w==D[from]){
            for(auto x: grafo[from]){
                long long int d=x.second;
                int to = x.first;
                if(d+w<D[to]){
                    D[to]=d+w;
                    next.push({d+w,to});
                }
            }
        }
        next.pop();
    }

    for(int i=0;i<N;i++){
        if(D[i]==1e18)  D[i]=-1;
    }
}