#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
long long n,m,S,T,L,K,ans;
long long h[N],to[N],val[N],nxt[N],cnt;
long long dis[N],p[N],z[N];
bool vis[N];
struct node{
long long v,w;
friend bool operator<(node x,node y){
return x.w>y.w;
}
};
priority_queue<node> q;
void add(long long a,long long b,long long c){
to[++cnt]=b;
val[cnt]=c;
nxt[cnt]=h[a];
h[a]=cnt;
}
void Dijkstra(long long s){
for(int i=1;i<=n;i++) dis[i]=1e18,vis[i]=0;
dis[s]=0;
q.push(node{s,0});
while(q.size()){
node k=q.top(); q.pop();
vis[k.v]=true;
for(int i=h[k.v];i;i=nxt[i]){
if(vis[to[i]]) continue;
if(dis[to[i]]>k.w+val[i]){
dis[to[i]]=k.w+val[i];
q.push(node{to[i],dis[to[i]]});
}
}
}
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n>>m;
cin>>S>>T>>L>>K;
for(int i=1;i<=m;i++){
long long a,b,c; cin>>a>>b>>c;
add(a,b,c); add(b,a,c);
}
Dijkstra(S);
for(int i=1;i<=n;i++) p[i]=dis[i];
if(p[T]<=K){
cout<<(n*n-n)/2;
return 0;
}
Dijkstra(T);
for(int i=1;i<=n;i++) z[i]=dis[i];
sort(z+1,z+n+1);
for(int i=1;i<=n;i++){
long long l=1,r=n;
while(l<=r){
long long mid=(l+r)/2;
if(p[i]+z[mid]+L<=K) l=mid+1;
else r=mid-1;
}
ans+=l-1;
}
cout<<ans;
return 0;
}