#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

struct Arco {
  int dest;
  int weight;

  Arco(int dest_, int weight_) : dest(dest_), weight(weight_) {};
};

struct Nodo {
  int index;
  long long distance;

  Nodo(int index_, long long distance_) : index(index_), distance(distance_) {}

  bool operator <(const Nodo& other) const {
    return distance>other.distance;
  }

};


const int MAXN = 300000;
vector<Arco> archi[MAXN];

void mincammino(int N, int M, vector<int> X, vector<int> Y, vector<int> P, vector<long long>& D) {
    fill(D.begin(), D.end(), -1);
  
    for(int i=0; i<M; i++)
      archi[X[i]].push_back({Y[i], P[i]});

    
    priority_queue<Nodo> pq;
    pq.push({0, 0});
    while(!pq.empty()) {
      Nodo n = pq.top();
      pq.pop();

      if(D[n.index]!=-1 && n.distance>D[n.index])
        return;
      D[n.index] = n.distance;

      for(const Arco x:archi[n.index]) {
          if(D[x.dest]==-1 || n.distance+x.weight<D[x.dest])
            pq.push({x.dest, n.distance+x.weight});
      }
    }
}
