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

void mincammino(int N, int M, vector<int> X, vector<int> Y, vector<int> P, vector<long long>& D) {
    int INF = INT_MAX/2;
    fill(D.begin(), D.end(), INF);
    D[0] = 0;

    vector<bool> vis(N, false);
    vis[0] = true;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> minHeap;
  
    vector<vector<pair<int, int>>> adj(N);
    for (int i = 0; i < M; i++) {
      adj[X[i]].push_back({i, P[i]});
      if (X[i] == 0) minHeap.push({P[i], i});
    }

    while (!minHeap.empty()) {
      int currNode = Y[minHeap.top().second];
      int prevNode = X[minHeap.top().second];
      long long currDis = D[prevNode] + P[minHeap.top().second];
      minHeap.pop();

      if (vis[currNode]) continue;
      
      D[currNode] = min(D[currNode], currDis);

      for (pair<int, int> x : adj[currNode]) {
        minHeap.push({D[currNode] + x.second, x.first});
      }

      vis[currNode] = true;
    }

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