#include<bits/stdc++.h>
using namespace std;
vector < pair<int,int> > adj_list[100];
int dist[100];
int par[100];
int Dijkstra(int start, int dest)
{
dist[start] = 0;
par[start] = -1;
priority_queue < pair <int,int> , vector < pair <int,int> >, greater < pair <int,int> > > pq;
pq.push({dist[start],start});
while(!pq.empty())
{
pair <int,int> tp = pq.top();
pq.pop();
int u = tp.second;
int cost = tp.first;
if(u == dest)
{
return cost;
}
for(int i=0;i<adj_list[u].size();i++)
{
pair <int,int> child_pair = adj_list[u][i];
int v = child_pair.second;
int wt = child_pair.first;
if(dist[u]+wt < dist[v])
{
dist[v] = dist[u] + wt;
par[v] = u;
pq.push({dist[v],v});
}
}
}
return -1;
}
int main()
{
int nodes, edges;
cin>>nodes>>edges;
for(int i=1;i<=edges;i++)
{
int u,v,wt;
cin>>u>>v>>wt;
adj_list[u].push_back({wt,v});
}
int start, dest;
cin>>start>>dest;
for(int i=1;i<=nodes;i++)
{
dist[i] = 1000000000;
}
int cost = Dijkstra(start,dest);
if(cost == -1)
{
cout<<"Disconnected"<<endl;
}
else
{
cout<<"Connected. Min Cost: "<<cost<<endl;
int currNode = dest;
stack <int> st;
while(currNode != -1)
{
st.push(currNode);
currNode = par[currNode];
}
cout<<"Path: ";
while(!st.empty())
{
cout<<st.top()<<" ";
st.pop();
}
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZlY3RvciA8IHBhaXI8aW50LGludD4gPiBhZGpfbGlzdFsxMDBdOwppbnQgZGlzdFsxMDBdOwppbnQgcGFyWzEwMF07CgppbnQgRGlqa3N0cmEoaW50IHN0YXJ0LCBpbnQgZGVzdCkKewogICAgZGlzdFtzdGFydF0gPSAwOwogICAgcGFyW3N0YXJ0XSA9IC0xOwogICAgcHJpb3JpdHlfcXVldWUgPCBwYWlyIDxpbnQsaW50PiAsIHZlY3RvciA8IHBhaXIgPGludCxpbnQ+ID4sIGdyZWF0ZXIgPCBwYWlyIDxpbnQsaW50PiA+ID4gcHE7CiAgICBwcS5wdXNoKHtkaXN0W3N0YXJ0XSxzdGFydH0pOwogICAgd2hpbGUoIXBxLmVtcHR5KCkpCiAgICB7CiAgICAgICAgcGFpciA8aW50LGludD4gdHAgPSBwcS50b3AoKTsKICAgICAgICBwcS5wb3AoKTsKICAgICAgICBpbnQgdSA9IHRwLnNlY29uZDsKICAgICAgICBpbnQgY29zdCA9IHRwLmZpcnN0OwogICAgICAgIGlmKHUgPT0gZGVzdCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBjb3N0OwogICAgICAgIH0KICAgICAgICBmb3IoaW50IGk9MDtpPGFkal9saXN0W3VdLnNpemUoKTtpKyspCiAgICAgICAgewogICAgICAgICAgICBwYWlyIDxpbnQsaW50PiBjaGlsZF9wYWlyID0gYWRqX2xpc3RbdV1baV07CiAgICAgICAgICAgIGludCB2ID0gY2hpbGRfcGFpci5zZWNvbmQ7CiAgICAgICAgICAgIGludCB3dCA9IGNoaWxkX3BhaXIuZmlyc3Q7CiAgICAgICAgICAgIGlmKGRpc3RbdV0rd3QgPCBkaXN0W3ZdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkaXN0W3ZdID0gZGlzdFt1XSArIHd0OwogICAgICAgICAgICAgICAgcGFyW3ZdID0gdTsKICAgICAgICAgICAgICAgIHBxLnB1c2goe2Rpc3Rbdl0sdn0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwp9CgppbnQgbWFpbigpCnsKICAgIGludCBub2RlcywgZWRnZXM7CiAgICBjaW4+Pm5vZGVzPj5lZGdlczsKICAgIGZvcihpbnQgaT0xO2k8PWVkZ2VzO2krKykKICAgIHsKICAgICAgICBpbnQgdSx2LHd0OwogICAgICAgIGNpbj4+dT4+dj4+d3Q7CiAgICAgICAgYWRqX2xpc3RbdV0ucHVzaF9iYWNrKHt3dCx2fSk7CiAgICB9CiAgICBpbnQgc3RhcnQsIGRlc3Q7CiAgICBjaW4+PnN0YXJ0Pj5kZXN0OwogICAgZm9yKGludCBpPTE7aTw9bm9kZXM7aSsrKQogICAgewogICAgICAgIGRpc3RbaV0gPSAxMDAwMDAwMDAwOwogICAgfQogICAgaW50IGNvc3QgPSBEaWprc3RyYShzdGFydCxkZXN0KTsKICAgIGlmKGNvc3QgPT0gLTEpCiAgICB7CiAgICAgICAgY291dDw8IkRpc2Nvbm5lY3RlZCI8PGVuZGw7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgY291dDw8IkNvbm5lY3RlZC4gTWluIENvc3Q6ICI8PGNvc3Q8PGVuZGw7CiAgICAgICAgaW50IGN1cnJOb2RlID0gZGVzdDsKICAgICAgICBzdGFjayA8aW50PiBzdDsKICAgICAgICB3aGlsZShjdXJyTm9kZSAhPSAtMSkKICAgICAgICB7CiAgICAgICAgICAgIHN0LnB1c2goY3Vyck5vZGUpOwogICAgICAgICAgICBjdXJyTm9kZSA9IHBhcltjdXJyTm9kZV07CiAgICAgICAgfQogICAgICAgIGNvdXQ8PCJQYXRoOiAiOwogICAgICAgIHdoaWxlKCFzdC5lbXB0eSgpKQogICAgICAgIHsKICAgICAgICAgICAgY291dDw8c3QudG9wKCk8PCIgIjsKICAgICAgICAgICAgc3QucG9wKCk7CiAgICAgICAgfQogICAgfQp9Cgo=