Uma forma direta de resolver o problema e remover todas as arestas que pertencem a algum menor caminho original e, depois, calcular novamente o menor caminho. Primeiro rodamos Dijkstra a partir de $S$ no grafo original, obtendo $distS[u]$, a menor distancia de $S$ ate cada vertice $u$. Em seguida rodamos Dijkstra no grafo reverso a partir de $D$, obtendo $distD[u]$, a menor distancia de $u$ ate $D$ no grafo original. Se $distS[D]$ for infinito, nao existe caminho de $S$ ate $D$ e a resposta ja e $-1$. Caso contrario, uma aresta direcionada $(u, v)$ de peso $p$ pertence a algum menor caminho de $S$ ate $D$ se, e somente se: \[ distS[u] + p + distD[v] = distS[D]. \] Essa igualdade diz que existe um menor caminho formado por um menor caminho de $S$ ate $u$, seguido pela aresta $(u, v)$, seguido por um menor caminho de $v$ ate $D$. Portanto, marcamos todas as arestas que satisfazem essa condicao como removidas. Por fim, rodamos Dijkstra mais uma vez a partir de $S$, ignorando as arestas removidas. A distancia obtida ate $D$ e o quase menor caminho; se ela for infinita, imprimimos $-1$. Cada execucao de Dijkstra custa $O((N+M)\log N)$. Como usamos tres execucoes, a complexidade total por caso de teste e $O((N+M)\log N)$ em tempo e $O(N+M)$ em memoria.