#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pi pair<int,int>
const int INF = 4e18;
int32_t main() {
cin.tie(0)->sync_with_stdio(0);
int n,m;
cin>> n>> m;
int s,t,l,k;
cin>> s>> t>> l>> k;
vector<vector<pair<int,int>>> g(n+1);
for (int i=0; i<m; i++) {
int u,v,w;
cin>> u>> v>> w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
vector<int> dist(n+1, INF), rdist(n+1, INF);
dist[s] = 0;
rdist[t] = 0;
priority_queue<pi, vector<pi>, greater<pi>> pq;
pq.push({0, s});
while (!pq.empty()) {
int u=pq.top().second, d=pq.top().first;
pq.pop();
if (dist[u] < d) continue;
for (auto &x : g[u]) {
int v=x.first, w=x.second;
if (dist[v] > dist[u]+w) {
dist[v] = dist[u]+w;
pq.push({dist[v], v});
}
}
}
pq.push({0, t});
while (!pq.empty()) {
int u=pq.top().second, d=pq.top().first;
pq.pop();
if (rdist[u] < d) continue;
for (auto &x : g[u]) {
int v=x.first, w=x.second;
if (rdist[v] > rdist[u]+w) {
rdist[v] = rdist[u]+w;
pq.push({rdist[v], v});
}
}
}
if (dist[t]<=k) {
cout<< n*(n-1)/2;
return 0;
}
vector<int> ans;
for (int i=1; i<=n; i++) ans.push_back(rdist[i]);
sort(ans.begin(), ans.end());
int cnt=0;
for (int i=1; i<=n; i++) {
int can = dist[i] + l;
int l=0, r=ans.size()-1;
while (l<=r) {
int mid=(l+r)/2;
if (ans[mid]+can <= k) l=mid+1;
else r=mid-1;
}
if (r!=-1) cnt+=l;
}
cout<< cnt;
}