#include <bits/stdc++.h>
using namespace std;

vector<vector<pair<int, int>>> connessioni;
set<pair<int, int>> to_simulate;  // tempo di arrivo, nodo

void mincammino(int N, int M, vector<int> X, vector<int> Y, vector<int> P, vector<long long>& D) {
    for(int i=0; i<N; i++){
        D[i] = -1;
    }

    connessioni.resize(N);

    for(int i=0; i<M; i++){
        connessioni[X[i]].push_back({Y[i], P[i]});
    }

    to_simulate.insert({0, 0});

    // esplorare -> mettere il tempo ottimale + aggiungere amici a to_simulate
    while(to_simulate.size() > 0){
        pair<int, int> a = *to_simulate.begin();
        to_simulate.erase(a);

        int nodo = a.second;
        int tempo = a.first;

        if(D[nodo] != -1) continue;  // se sono già stato esplorato passo
        D[nodo] = tempo;
        
        for (auto amico : connessioni[nodo]){
            to_simulate.insert({tempo+amico.second, amico.first});
        }
    }
}