#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define N 60000
#define P(x,y) make_pair((x),(y))
const LL mod=10000007;
LL n,m,s,t,x,y,z,cnt,tot,ans,dp[N][2],head[N],q[N],dist[N],hsh[12000000];
bitset<N> f[N],g[N];
bool vis[N];
priority_queue< pair<LL,LL>,vector< pair<LL,LL> >,greater< pair<LL,LL> > > pq;
struct edge{LL v,nxt,l;}e[N*2];
LL getnxt(LL &x){return (++x)%n;}
void add(LL x,LL y,LL z){e[++tot].v=y; e[tot].nxt=head[x]; e[tot].l=z; head[x]=tot;}
void dij(){
memset(dist,0x3f,sizeof dist); pq.push(P(0,s)); dist[s]=0;
while (!pq.empty()){
pair<LL,LL> pr=pq.top(); pq.pop();
LL d=pr.first,u=pr.second;
if (vis[u]) continue;
vis[u]=1; q[++q[0]]=u;
for (LL i=head[u],v;i;i=e[i].nxt){
if (dist[v=e[i].v]>d+e[i].l){dist[v]=d+e[i].l; pq.push(P(dist[v],v));}
}
}
}
int main(){
scanf("%lld%lld%lld%lld",&n,&m,&s,&t);
for (LL i=1;i<=m;i++){
scanf("%lld%lld%lld",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
dij();
dp[s][0]=1;
for (LL i=1,u;i<=q[0];i++)
for (LL j=head[u=q[i]],v;j;j=e[j].nxt)
if (dist[v=e[j].v]==dist[u]+e[j].l) (dp[v][0]+=dp[u][0])%=mod;
dp[t][1]=1;
for (LL i=q[0],u;i>=1;i--)
for (LL j=head[u=q[i]],v;j;j=e[j].nxt){
v=e[j].v;
if (dist[u]==dist[v=e[j].v]+e[j].l) (dp[v][1]+=dp[u][1])%=mod;
}
if (dp[t][0]==0){printf("%lld\n",(LL)n*(n-1)/2); return 0;}
for (LL i=q[0],u;i>=1;i--){
u=q[i]; f[u][u]=1;
if (dp[u][0]*dp[u][1]){
for (LL j=head[u],v;j;j=e[j].nxt){
v=e[j].v;
if (dp[v][0]*dp[v][1] && dist[u]==dist[v]+e[j].l) f[v]|=f[u];
}
}
}
for (LL i=1;i<=n;i++){
LL tmp=(LL)dp[i][0]*dp[i][1]%mod;
if (!hsh[tmp]) hsh[tmp]=++cnt;
g[hsh[tmp]][i]=1;
}
for (LL i=1;i<=q[0];i++){
int u=q[i];
LL j=hsh[(mod+dp[t][0]-(LL)dp[u][0]*dp[u][1]%mod)%mod];
g[hsh[(LL)dp[u][0]*dp[u][1]%mod]][u]=0;
ans+=((~f[u])&g[j]).count();
}
printf("%lld\n",ans);
return 0;
}