#include <algorithm>
#include <bits/stdc++.h>
#include <climits>
#include <queue>
#include <vector>
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) {
  fill(D.begin(), D.end(), LLONG_MAX);

  vector<vector<array<ll, 2>>> adj(N);

  for (int i = 0; i < M; i++) {
    adj[X[i]].push_back({Y[i], P[i]});
  }
  priority_queue<array<ll, 2>> queue;

  D[0] = 0;
  queue.push({0, 0});
  vector<bool> visited(N, 0);
  while (!queue.empty()) {
    ll curr = queue.top()[1];
    queue.pop();
    if (visited[curr])
      continue;

    visited[curr] = true;
    for (auto [child, w] : adj[curr]) {
      if (D[child] > D[curr] + w) {
        D[child] = D[curr] + w;
        queue.push({-D[child], child});
      }
    }
  }
  for (int i = 0; i < N; i++) {
    if (D[i] == LLONG_MAX)
      D[i] = -1;
  }
}
