#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) {
  fill(D.begin(), D.end(), -1);
  D[0] = 0;
  priority_queue<pair<int, long long>, vector<pair<int, long long>>, greater<pair<int, long long>>> pq;
  pq.push({0, 0});
  vector<vector<pair<int, int>>> G(N);
  for(int i = 0; i<M; i++){
    G[X[i]].push_back({P[i], Y[i]});
  }
  while(!pq.empty()){
    auto [c, u] = pq.top();
    pq.pop();
    for(auto p : G[u]){
      int v = p.second;
      int n = p.first;
      if(c+n < D[v] || D[v] == -1){
        D[v]=c+n;
        pq.push({D[v], v});
      }
    }
  }
}