Link to this code: https://cses.fi/paste/7dbcb85d61eee28d67c0ef/
#include <iostream>
#include<vector>
#include<array>
#include<queue>

using namespace std;
#define ll long long int
#define mod (ll)(1e9+7)
#define a2 array<ll,2>

int main(){
  int n,m,a,b,place;
  ll w;
  cin>>n>>m;
  vector<array<ll,2>>graph[m+1];
  vector<ll>minFlights(n+1,1e17),maxFlights(n+1,0),minPriceRoutes(n+1,0),minPrice(n+1,1e17);
  for(int i=0;i<m;i++){
    cin>>a>>b>>w;
    graph[a].push_back({w,b});
  }
  minPrice[1]=0;
  minFlights[1]=0;
  minPriceRoutes[1]=1;
  priority_queue<a2,vector<a2>,greater<a2>>que;
  que.push({0,1});
  while(!que.empty()){
     place=que.top()[1];
     w=que.top()[0];
     que.pop();
     if(minPrice[place]<w)continue;
     for(auto &city:graph[place]){
       if(city[0]+w<minPrice[city[1]]){
          minPrice[city[1]]=city[0]+w;
          minFlights[city[1]]=minFlights[place]+1;
          maxFlights[city[1]]=maxFlights[place]+1;        
          minPriceRoutes[city[1]]=minPriceRoutes[place];
          que.push({minPrice[city[1]],city[1]});
       }else if(city[0]+(ll)w==minPrice[city[1]]){
          minFlights[city[1]]=min(minFlights[city[1]],minFlights[place]+1);
          maxFlights[city[1]]=max(maxFlights[city[1]],maxFlights[place]+1);        
          minPriceRoutes[city[1]]=(minPriceRoutes[city[1]]+minPriceRoutes[place])%mod;     
       }
     }
  }
  cout<<minPrice[n]<<" "<<minPriceRoutes[n]<<" "<<minFlights[n]<<" "<<maxFlights[n];
  return 0;
}