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

void mincammino(int N, int M, vector<int> X, vector<int> Y, vector<int> P, vector<long long>& D) {
    /*
    • Gli array X, Y e P
• La funzione dovrà popolare l’array D, dove, per ogni i = 0 . . . N −1, il valore Di dovrà essere uguale
alla lunghezza del cammino minimo dal nodo 0 al nodo i. Se il nodo i non è raggiungibile dal nodo
0, Di dovrà essere −1.
    */

    D.clear();
    D.assign(N, LONG_LONG_MAX);

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


    vector<int> visited(N, false);
    priority_queue<pair<long long, int>> Asp;
    Asp.push({0, 0});
    visited[0] = true;

    while (! Asp.empty()){
        auto [dist, pos] = Asp.top(); Asp.pop();
        dist *= -1;

        if (visited[pos]) continue;
        visited[pos] = true;
        
        for (auto [v, peso]: grafo[pos]){
            long long new_peso = dist + peso;
            D[v] = min(D[v], new_peso);

            Asp.push({-new_peso, v});
        }
    }

    for (auto& x:D) if (x == LONG_LONG_MAX) x = -1; 
    
}
