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

vector<vector<pair<long long, long long>>> connessioni;
set<pair<long long, long long>> 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(long long i=0; i<N; i++){
        D[i] = -1;
    }

    connessioni.resize(N);

    for(long long 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<long long, long long> a = *to_simulate.begin();
        to_simulate.erase(a);

        long long nodo = a.second;
        long long 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});
        }
    }
}