CSES - Shared codeLink 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;
}