#include <stdio.h>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define inf 100000000
int main()
{
vector<int> V[100];
int cost[100][100];
queue<int> Q;
int v, e;
scanf("%d %d", &v, &e);
for (int a = 0; a < e; a++)
{
int m, n, z;
scanf("%d %d %d", &m, &n, &z);
cost[m][n] = z;
V[m].push_back(n);
}
int s, d;
//cout << "Enter Source:";
scanf("%d", &s);
//cout << "Enter Destination:";
scanf("%d", &d);
int dis[100] = {inf};
int color[100] = {0};
int parent[100];
for (int i = 0; i < 100; ++i)
dis[i] = inf;
dis[s] = 0;
dis[d] = inf + 1;
int source;
source = s;
Q.push(s);
//for (int c = 0;c < V[d].size(); c++) //I dont need to visit nodes from destination
//{
// color[V[d][c]] = 2;
//}
do {
if (source == d)
break;
for (int b = 0; b < V[source].size(); b++)
{
int adj = V[source][b];
if (color[adj] != 2)
{
Q.push(adj);
color[adj] = 1;
}
if (dis[adj] > (dis[source] + cost[source][adj]))
{
dis[adj] = dis[source] + cost[source][adj];
parent[adj] = source;
}
if (dis[adj] >= dis[d] && adj != d) //If I detect any path already crossing limit updated by loop I can ignore it
{
color[adj] = 2;
}
}
color[source] = 2;
Q.pop();
source = Q.front();
} while (!Q.empty());
cout << "The minimum distance is " << dis[d] << ".\n";
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHF1ZXVlPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgaW5mIDEwMDAwMDAwMAoKaW50IG1haW4oKQp7Cgl2ZWN0b3I8aW50PiBWWzEwMF07CglpbnQgY29zdFsxMDBdWzEwMF07CglxdWV1ZTxpbnQ+IFE7CglpbnQgdiwgZTsKCglzY2FuZigiJWQgJWQiLCAmdiwgJmUpOwoJZm9yIChpbnQgYSA9IDA7IGEgPCBlOyBhKyspCgl7CgkJaW50IG0sIG4sIHo7CgkJc2NhbmYoIiVkICVkICVkIiwgJm0sICZuLCAmeik7CgkJY29zdFttXVtuXSA9IHo7CgkJVlttXS5wdXNoX2JhY2sobik7Cgl9CgoJaW50IHMsIGQ7CgkvL2NvdXQgPDwgIkVudGVyIFNvdXJjZToiOwoJc2NhbmYoIiVkIiwgJnMpOwoJLy9jb3V0IDw8ICJFbnRlciBEZXN0aW5hdGlvbjoiOwoJc2NhbmYoIiVkIiwgJmQpOwoKCWludCBkaXNbMTAwXSA9IHtpbmZ9OwoJaW50IGNvbG9yWzEwMF0gPSB7MH07CglpbnQgcGFyZW50WzEwMF07CgoJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkKCQlkaXNbaV0gPSBpbmY7CgoJZGlzW3NdID0gMDsKCWRpc1tkXSA9IGluZiArIDE7CglpbnQgc291cmNlOwoJc291cmNlID0gczsKCVEucHVzaChzKTsKCS8vZm9yIChpbnQgYyA9IDA7YyA8IFZbZF0uc2l6ZSgpOyBjKyspICAvL0kgZG9udCBuZWVkIHRvIHZpc2l0IG5vZGVzIGZyb20gZGVzdGluYXRpb24KCS8vewoJLy8JY29sb3JbVltkXVtjXV0gPSAyOwoJLy99CgoJZG8gewoJCWlmIChzb3VyY2UgPT0gZCkKCQkJYnJlYWs7CgkJZm9yIChpbnQgYiA9IDA7IGIgPCBWW3NvdXJjZV0uc2l6ZSgpOyBiKyspCgkJewoJCQlpbnQgYWRqID0gVltzb3VyY2VdW2JdOwoJCQlpZiAoY29sb3JbYWRqXSAhPSAyKQoJCQl7CgkJCQlRLnB1c2goYWRqKTsKCQkJCWNvbG9yW2Fkal0gPSAxOwoJCQl9CgoJCQlpZiAoZGlzW2Fkal0gPiAoZGlzW3NvdXJjZV0gKyBjb3N0W3NvdXJjZV1bYWRqXSkpCgkJCXsKCQkJCWRpc1thZGpdID0gZGlzW3NvdXJjZV0gKyBjb3N0W3NvdXJjZV1bYWRqXTsKCQkJCXBhcmVudFthZGpdID0gc291cmNlOwoJCQl9CgkJCWlmIChkaXNbYWRqXSA+PSBkaXNbZF0gJiYgYWRqICE9IGQpICAvL0lmIEkgZGV0ZWN0IGFueSBwYXRoIGFscmVhZHkgY3Jvc3NpbmcgbGltaXQgdXBkYXRlZCBieSBsb29wIEkgY2FuIGlnbm9yZSBpdAoJCQl7CgkJCQljb2xvclthZGpdID0gMjsKCQkJfQoJCX0KCQljb2xvcltzb3VyY2VdID0gMjsKCQlRLnBvcCgpOwoJCXNvdXJjZSA9IFEuZnJvbnQoKTsKCX0gd2hpbGUgKCFRLmVtcHR5KCkpOwoKCWNvdXQgPDwgIlRoZSBtaW5pbXVtIGRpc3RhbmNlIGlzICIgPDwgZGlzW2RdIDw8ICIuXG4iOwoJcmV0dXJuIDA7Cn0=