Dijkstra with path counts
Time O(E log V) Space O(V + E)dist[0] = 0, ways[0] = 1. When relaxing u → v: shorter → replace dist and ways and push; equal → add ways[u].
import java.util.*;
class Solution {
public int countPaths(int n, int[][] roads) {
final int MOD = 1_000_000_007;
List<List<int[]>> adj = new ArrayList<>();
for (int i = 0; i < n; i++) adj.add(new ArrayList<>());
for (int[] r : roads) { adj.get(r[0]).add(new int[]{r[1], r[2]}); adj.get(r[1]).add(new int[]{r[0], r[2]}); }
long[] dist = new long[n];
Arrays.fill(dist, Long.MAX_VALUE);
long[] ways = new long[n];
dist[0] = 0;
ways[0] = 1;
PriorityQueue<long[]> pq = new PriorityQueue<>((a, b) -> Long.compare(a[0], b[0]));
pq.offer(new long[]{0, 0});
while (!pq.isEmpty()) {
long[] t = pq.poll();
long d = t[0];
int u = (int) t[1];
if (d > dist[u]) continue;
for (int[] e : adj.get(u)) {
int v = e[0];
long nd = d + e[1];
if (nd < dist[v]) { dist[v] = nd; ways[v] = ways[u]; pq.offer(new long[]{nd, v}); }
else if (nd == dist[v]) ways[v] = (ways[v] + ways[u]) % MOD;
}
}
return (int) ways[n - 1];
}
}Verdict: Each node's count is final when it's popped.