#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <vector>

using namespace std;

int a[10010][10010];
int d[10010][10010];
int p[10010][10010];
int kor[10010][10010];
int n;
int m;
int ga;
int gb;
bool rez[10010][10010];

bool koriscena(int i, int j,  int ip, int jk)
{
     if(i==ip && j==jk) return true;
     else
     {
         int k=p[ip][jk];
         if(k!=ip)
         {
             return koriscena(i,j,ip,k) || koriscena(i,j,k,jk);
         }
         return false;
     }
}

void brisiDoSadKoriscene(int i, int j)
{
     int k=p[i][j];
     if(k!=i)
     {
        brisiDoSadKoriscene(i,k);
        brisiDoSadKoriscene(k,j);
     }
     else
        kor[i][j]--;
}
void dodajKoriscene(int i, int j)
{
     int k=p[i][j];
     if(k!=i)
     {
        dodajKoriscene(i,k);
        dodajKoriscene(k,j);
     }
     else
        kor[i][j]++;
}

void flojd()
{
     int i=0, j=0, k=0;
     for(i=1;i<=n;i++)
       for(j=1;j<=n;j++)
       {
          d[i][j]=a[i][j];
          if(d[i][j]>0) {p[i][j]=i; kor[i][j]=1;}
       }
     for(k=1;k<=n;k++)
       for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
          {
             if(i!=j && d[i][k]!=-1 && d[k][j]!=-1)
             {
                if(d[i][k]+d[k][j]==d[i][j]) rez[i][j]=true;
                else
                   if(d[i][j]==-1 || d[i][j]>d[i][k]+d[k][j])
                   {
                       brisiDoSadKoriscene(i,j);
                       d[i][j]=d[i][k]+d[k][j];
                       p[i][j]=k;
                       dodajKoriscene(i,j);
                       rez[i][j]=false;
                   }
             }
          }
}

int main()
{
    FILE *f,*g;
    f=fopen("nishtel.in","r");
    g=fopen("nishtel.out","w");
    fscanf(f,"%d%d%d%d", &n, &m, &ga, &gb);
    int i=0, j=0;
    int br=0;
    for(i=1;i<=n;i++)
    {
      for(j=1;j<=n;j++)
      {
         a[i][j]=-1; d[i][j]=-1;p[i][j]=-1; kor[i][j]=0;
      }
    }
    int t=0;
    for(int b=1;b<=m;b++)
    {
        fscanf(f,"%d %d %d", &i,&j, &t);
        if(a[i][j]==-1) a[i][j]=t;
        else if(a[i][j]>t) { a[i][j]=t; br++; }
    }
//    fprintf(g,"%d", br);
    flojd();
    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
      {
          if(kor[i][j]==1 && rez[i][j]) br++;
          for(int k=1;k<=n;k++)
          {
             if(!koriscena(j,k,ga,i)&& !koriscena(j,k,gb,i)) br++;
          }
      }
    printf("5");
    fprintf(g,"%d\n", br);
    system("pause");
    fclose(f);
    fclose(g);
}
