#define ret return
#define INF 2'147'483'647
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

void mincammino(int N, int M, vector<int> X, vector<int> Y, vector<int> P, vector<long long>&D)
{
	vector<vector<pair<int, int>>> graph(N);
	for (int i = 0; i < M; ++i) graph[X[i]].push_back({ Y[i], P[i] }); // (fine, peso)

	D[0] = 0;
	for (int i = 1; i < N; ++i) D[i] = INF;

	vector<int> visited(N, false);

	priority_queue<pair<long long, int>> order; // (-distanza, id)
	order.push({ 0, 0 });

	while (!order.empty()) {

		int current = order.top().second;
		order.pop();

		if (visited[current]) continue;
		visited[current] = true;

		for (const auto& node : graph[current]) {

			if (D[node.first] > node.second + D[current])
				D[node.first] = node.second + D[current];

			order.push({ -D[node.first], node.first });
		}
	}
	for (int i = 1; i < N; ++i) if (D[i] == INF) D[i] = -1;
}