Cod sursa(job #68321)
using namespace std;
#include <cstdio>
#include <cassert>
#include <vector>
#include <string.h>
#define FIN "sate.in"
#define FOUT "sate.out"
#define NMAX 1<<15
#define INF 0x3f3f3f3f
#define pb push_back
vector <int> A[NMAX], Dist[NMAX];
int N, M, X, Y, D[NMAX], ended, cd[NMAX<<1], a, b, d;
char s[1<<8];
void get ()
{
a = b = d = 0;
int len = strlen (s), ct, i = len - 2;
ct = 1;
while (s[i] != ' ')
{
d += ct * (s[i] - '0');
ct *= 10;
-- i;
}
-- i;
ct = 1;
while (s[i] != ' ')
{
b += ct * (s[i] - '0');
ct *= 10;
-- i;
}
-- i;
ct = 1;
while (i >= 0)
{
a += ct * (s[i] - '0');
ct *= 10;
-- i;
}
}
void read ()
{
scanf ("%d %d %d %d\n", &N, &M, &X, &Y);
for (int i = 1; i <= M; ++ i)
{
fgets (s, 100, stdin);
get ();
A[a].pb (b);
A[b].pb (a);
Dist[a].pb (d);
Dist[b].pb (d);
}
}
void bf ()
{
int v, sz, i;
cd[ended = 0] = X;
D[X] = 1;
for (int pas = 0; pas <= ended; ++ pas)
{
v = cd[pas];
sz = A[v].size ();
for (i = 0; i < sz; ++ i)
if (!D[A[v][i]])
{
if (A[v][i] < v)
D[A[v][i]] = D[v] - Dist[v][i];
else
D[A[v][i]] = D[v] + Dist[v][i];
//fprintf (stderr, "%d %d\n", A[v][i], D[A[v][i]]);
cd[++ ended] = A[v][i];
if (A[v][i] == Y)
return;
}
}
}
void solve ()
{
bf ();
printf ("%d\n", D[Y] - 1);
}
int
main ()
{
freopen (FIN, "rt", stdin);
freopen (FOUT, "wt", stdout);
read ();
solve ();
return 0;
}