#include <iostream>
#include <vector>
#include <queue>
using namespace std;

void mincammino(int N, int M, vector<int> X, vector<int> Y, vector<int> P, vector<long long>& D){
	priority_queue<pair<long long,int> >Q;
	vector<bool>B(N);
	for(int i=0; i<N; i++){
		D[i]=-1;
		B[i]=0;
	}
	D[0]=0;
	vector< vector< int > > L(N);
	vector< vector< int > > P0(N);
	for(int i=0; i<M; i++){
		L[X[i]].push_back(Y[i]);
	}
	for(int i=0; i<M; i++){
		P0[X[i]].push_back(P[i]);
	}
	
	for(int i=0; i<L[0].size(); i++){
		D[L[0][i]]=P0[0][i];
		Q.push({-D[L[0][i]],L[0][i]});
	}
	while(1-(Q.size()==0)){
		long long x=-Q.top().first;
		int p=Q.top().second;
	/*	cout<<x<<" "<<p<<endl;
		for(int i=0; i<N; i++){
			cout<<D[i]<<" ";
		}
		cout<<endl;*/
		if(B[p]==1){
			
		}else{
			B[p]=1;
		//	cout<<"analisi vicini di "<< p<<": "<<endl;
			for(int i=0; i<L[p].size(); i++){
		//		cout<<L[p][i]<<": ";
		//		cout<<D[L[p][i]]<<endl;
		//		cout<<D[p]+P0[p][i]<<endl;
				if(D[L[p][i]]>D[p]+P0[p][i]||D[L[p][i]]==-1){
					D[L[p][i]]=D[p]+P0[p][i];
					Q.push({-D[L[p][i]],L[p][i]});
				}
			}		
		}
		Q.pop();
	}
	
}
