#include <iostream>
#include <vector>
#include <queue>
#include <climits>
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){
    vector<vector<pair<int,int>>>adj(N);
    for(int i=0;i<M;i++){
        adj[X[i]].push_back({Y[i],P[i]});
    }
    vector<ll>dis(N,-1);
    vector<bool>vis(N,false);
    priority_queue<pair<ll,int>>pq;
    pq.push({(ll)0,0});
    dis[0]=(ll)0;
    while(!pq.empty()){
        int v=pq.top().second;
        pq.pop();
        if(vis[v]){
            continue;
        }
        vis[v]=true;
        for(auto[w,d]:adj[v]){
            if(dis[w]>dis[v]+(ll)d||dis[w]<0){
                dis[w]=dis[v]+(ll)d;
                pq.push({-dis[w],w});
            }
        }
    }
    D=dis;
}
