#include <bits/stdc++.h>
using namespace std;
using cosabrutta = pair<long long, int>;
void mincammino(int N, int M, vector<int> X, vector<int> Y, vector<int> P, vector<long long> &D)
{
    const long long INF = numeric_limits<long long>::max() / 4;
    D.assign(N > 0 ? N : 0, INF);

    vector<int> head(N + 1, 0);
    for (int i = 0; i < M; i++)
    {
        head[X[i] + 1]++;
    }
    partial_sum(head.begin(), head.end(), head.begin());
    vector<int> target(M);
    vector<int> peso(M);
    vector<int> riempi(head.begin(), head.end() - 1);
    for (int i = 0; i < M; i++)
    {
        int boh = riempi[X[i]]++; // bomboclat perchè penso in inglese
        target[boh] = Y[i];
        peso[boh] = P[i];
    }
    priority_queue<cosabrutta, vector<cosabrutta>, greater<cosabrutta>> pq;
    D[0] = 0;
    pq.push({0, 0});

    while (!pq.empty())
    {
        auto [dist, v] = pq.top();
        pq.pop();
        if (dist != D[v])
            continue;
        for (long long e = head[v]; e < head[v + 1]; e++)
        {
            long long marcogambaro = dist + peso[e];
            long long destinazione = target[e];
            if (marcogambaro < D[destinazione])
            {
                D[destinazione] = marcogambaro;
                pq.push({marcogambaro, destinazione});
            }
        }
    }
    for (auto &d : D)
    {
        if (d == INF)
        {
            d = -1;
        }
    }
}
