#include <vector>
#include <algorithm>

#include <bits/stdc++.h>

using namespace std;

struct Node {
    long long weight = 0;
    int id = 0;

    bool operator<(const Node& x) const {
        return weight > x.weight;
    }

    Node(long long w, int i){
        weight = w;
        id = i;
    }
};

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);

    vector<vector<pair<int, long long>>> adj(N);
    for (int i = 0; i < M; i++){
        adj[X[i]].push_back({Y[i], P[i]});
    }

    priority_queue<Node> queue;
    queue.push(Node(0, 0));

    vector<bool> visited(N, false);

    while (!queue.empty()){
        Node n = queue.top();
        queue.pop();
        
        long long peso = n.weight;
        int vert = n.id;

        if (visited[vert]) continue;
        else visited[vert] = true;

        D[vert] = peso;

        for (auto [u, p] : adj[vert]){
            if (!visited[u]){
                queue.push(Node(p + peso, u));
            }
        }
    } 
}
