#include <bits/stdc++.h>
using namespace std;
const int NMAX = 100000;
#define int long long
const int INFINI = 1e17;
struct T {
    int noeud, temps, anc;
    bool operator<(const T &other)  const {
        return temps > other.temps;
    }
};
int nbVilles, nbChemins, maison, ecole, point1, point2;
vector<T> chemins[NMAX];
int dejaVu[NMAX];
vector<int> ancNoeud[NMAX];
int miniTemps[NMAX];
vector<int> grapheGratuit[2][NMAX];
void construire(int noeud)
{
    if(noeud == -1) return;
    if(dejaVu[noeud] == 2)  return;
    dejaVu[noeud] = 2;
    for(auto pro : ancNoeud[noeud])
    {
       // cout << noeud << " " << pro << endl;
        if(pro == -1)   continue;
        grapheGratuit[1][noeud].push_back(pro);
        grapheGratuit[0][pro].push_back(noeud);
        construire(pro);
    }
}
struct C {
    int noeud, temps, autorisations;
    bool operator<(const C &other)  const {
        return temps > other.temps;
    }
};
bool dejaVuFin[3][NMAX];
signed main() {
	// your code goes here
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> nbVilles >> nbChemins >> maison >> ecole >> point1 >> point2;
    --maison;
    --ecole;
    --point1;
    --point2;
    
    for(int iChemin = 0; iChemin < nbChemins; iChemin++)
    {
        int a, b, t;
        cin >> a >> b >> t;
        --a;
        --b;
        chemins[a].push_back({b, t, -1});
        chemins[b].push_back({a, t, -1});
    }
	for(int i = 0; i < nbVilles; i++)
	{
		miniTemps[i] = INFINI;
	}
    priority_queue<T> plusCourtChemin;
    plusCourtChemin.push({maison, 0, -1});
    while(plusCourtChemin.size())
    {
        auto sit = plusCourtChemin.top();
        plusCourtChemin.pop();
        if(dejaVu[sit.noeud] == 1)
        {
            if(miniTemps[sit.noeud] == sit.temps)
            {
                ancNoeud[sit.noeud].push_back(sit.anc);
            }
            continue;
        }
       // cout << sit.noeud+1 << " " << sit.temps << endl;
        ancNoeud[sit.noeud].push_back(sit.anc);
        dejaVu[sit.noeud] = 1;
        miniTemps[sit.noeud] = sit.temps;
        for(auto pro : chemins[sit.noeud])
        {
            plusCourtChemin.push({pro.noeud, pro.temps+sit.temps, sit.noeud});
        }
    }
    
    construire(ecole);
    /*
    for(int i = 0; i < nbVilles; i++)
    {
        cout << i+1 << " : ";
        for(int pro : grapheGratuit[0][i]) cout << pro+1 << " ";
        cout << endl;
        for(int pro : grapheGratuit[1][i])  cout << pro+1 << " ";
        cout << endl;
    }
        /** */
    priority_queue<C> plusCourtCheminFin;
    plusCourtCheminFin.push({point1, 0, 2});
    while(plusCourtCheminFin.size())
    {
        auto sit = plusCourtCheminFin.top();
        plusCourtCheminFin.pop();
        if(sit.noeud == point2)
        {
            cout << sit.temps;
            return 0;
        }
        if(dejaVuFin[sit.autorisations][sit.noeud] == true)    continue;
        dejaVuFin[sit.autorisations][sit.noeud] = true;
       // cout << sit.noeud+1 << " " << sit.temps << " " << sit.autorisations << endl;
        for(auto pro : chemins[sit.noeud])
        {
            plusCourtCheminFin.push({pro.noeud, pro.temps+sit.temps, sit.autorisations});
        }
        if(sit.autorisations == 2)
        {
            for(int i = 0; i < 2; i++)
            {
                for(auto pro : grapheGratuit[i][sit.noeud]) plusCourtCheminFin.push({pro, sit.temps, i});
            }
        }
        else
        {
            for(auto pro : grapheGratuit[sit.autorisations][sit.noeud]) plusCourtCheminFin.push({pro, sit.temps, sit.autorisations});
        }
    }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |