#include <vector>
#include <array>
#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<array<int, 2>>> adj (N);
  for(int i=0; i<M; i++){
    adj[X[i]].push_back({Y[i], P[i]});
  }

  D.assign(N, 1e18);
  priority_queue<array<long long, 2>, vector<array<long long, 2>>, greater<array<long long, 2>>> pq;
  D[0] = 0;
  pq.push({0, 0});
  while(!pq.empty()){
    auto [d, u] = pq.top();
    pq.pop();
    if(d > D[u]) continue;
    for(auto [v, w]: adj[u]){
      if(D[u] + w < D[v]){
        D[v] = D[u] + w;
        pq.push({D[v], v});
      }
    }
  }

  for(int i=0; i<N; i++){
    if(D[i] == 1e18) D[i] = -1;
  }
}
