include <stdio.h>
include <stdlib.h>
define VC 1000000000
int d_t[10005], dc_t[100005], ts_t[100005], kt_t[100005], sm_t = 0;
int d_n[10005], dc_n[100005], ts_n[100005], kt_n[100005], sm_n = 0;
void t_ct(int d1, int d2, int ts) {
sm_t++; dc_t[sm_t] = d2; ts_t[sm_t] = ts; kt_t[sm_t] = d_t[d1]; d_t[d1] = sm_t;
}
void t_cn(int d1, int d2, int ts) {
sm_n++; dc_n[sm_n] = d2; ts_n[sm_n] = ts; kt_n[sm_n] = d_n[d1]; d_n[d1] = sm_n;
}
typedef struct { int kc, d; } Pt;
Pt hd[1000005];
int s_hd = 0;
void hd_t(int kc, int d) {
hd[++s_hd] = (Pt){kc, d};
int i = s_hd;
while (i > 1 && hd[i].kc < hd[i / 2].kc) {
Pt x = hd[i]; hd[i] = hd[i / 2]; hd[i / 2] = x;
i /= 2;
}
}
Pt hd_l() {
Pt r = hd[1];
hd[1] = hd[s_hd--];
int i = 1;
while (i * 2 <= s_hd) {
int j = i * 2;
if (j < s_hd && hd[j + 1].kc < hd[j].kc) j++;
if (hd[i].kc <= hd[j].kc) break;
Pt x = hd[i]; hd[i] = hd[j]; hd[j] = x;
i = j;
}
return r;
}
int kcd[10005], kcc[10005];
void t_dd(int xp, int* kc, int d_d[], int dc_d[], int ts_d[], int kt_d[], int sd) {
for (int i = 1; i <= sd; i++) kc[i] = VC;
kc[xp] = 0;
s_hd = 0;
hd_t(0, xp);
while (s_hd > 0) {
Pt x = hd_l();
if (x.kc > kc[x.d]) continue;
for (int i = d_d[x.d]; i; i = kt_d[i]) {
int d2 = dc_d[i];
int ts = ts_d[i];
if (kc[d2] > kc[x.d] + ts) {
kc[d2] = kc[x.d] + ts;
hd_t(kc[d2], d2);
}
}
}
}
int main() {
int sd, sc, sk, s_s, s_t;
if (scanf("%d %d %d %d %d", &sd, &sc, &sk, &s_s, &s_t) != 5) return 0;
for (int i = 0; i < sc; i++) {
int d1, d2, ts;
scanf("%d %d %d", &d1, &d2, &ts);
t_ct(d1, d2, ts);
t_cn(d2, d1, ts);
}
t_dd(s_s, kcd, d_t, dc_t, ts_t, kt_t, sd);
t_dd(s_t, kcc, d_n, dc_n, ts_n, kt_n, sd);
int kqn = kcd[s_t];
for (int i = 0; i < sk; i++) {
int d1, d2, ts;
scanf("%d %d %d", &d1, &d2, &ts);
if (kcd[d1] != VC && kcc[d2] != VC) {
if (kqn > kcd[d1] + ts + kcc[d2]) kqn = kcd[d1] + ts + kcc[d2];
}
if (kcd[d2] != VC && kcc[d1] != VC) {
if (kqn > kcd[d2] + ts + kcc[d1]) kqn = kcd[d2] + ts + kcc[d1];
}
}
if (kqn == VC) printf("-1\n");
else printf("%d\n", kqn);
return 0;
}