#include<bits/stdc++.h>
#define pll pair<ll,ll>
#define ll long long
using namespace std;
const int N = 2e5 + 5;
ll n, m, s, t, l, k;
ll cnt, h[N];
struct node {
int nxt, to, dis;
} e[N * 2];
void add(int x, int y, int z) {
e[++cnt].nxt = h[x];
e[cnt].to = y;
e[cnt].dis = z;
h[x] = cnt;
}
void dijkstra(int start, vector<ll>& dis) {
priority_queue<pll, vector<pll>, greater<pll>> q;
dis.assign(n + 1, LLONG_MAX / 2);
dis[start] = 0;
q.push({0, start});
while (!q.empty()) {
int x = q.top().second;
ll d = q.top().first;
q.pop();
if (d > dis[x]) continue;
for (int i = h[x]; i; i = e[i].nxt) {
int y = e[i].to;
ll nd = e[i].dis;
if (dis[y] > dis[x] + nd) {
dis[y] = dis[x] + nd;
q.push({dis[y], y});
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m >> s >> t >> l >> k;
for (int i = 1; i <= m; i++) {
ll x, y, z;
cin >> x >> y >> z;
add(x, y, z);
add(y, x, z);
}
vector<ll> dis_s(n + 1), dis_t(n + 1);
dijkstra(s, dis_s);
dijkstra(t, dis_t);
ll od = dis_s[t];
if (od <= k) {
cout << n * (n - 1) / 2 << "\n";
return 0;
}
ll ans = 0;
for (int u = 1; u <= n; u++) {
for (int v = u + 1; v <= n; v++) {
ll new_dist = min(od, min(dis_s[u] + l + dis_t[v], dis_s[v] + l + dis_t[u]));
if (new_dist <= k) ans++;
}
}
cout << ans << "\n";
return 0;
}
记录