#include <bits/stdc++.h>
using namespace std;
constexpr int N = 50 + 10;
constexpr int MOD = 1e9 + 7;
int n, mm, u, vv, w, dist[N][N], g1, g2, s1, s2;
long long ps[N][N], dp[N][N];
long long ans;
vector<int> v[N];
bool can(int a, int b) {
  if (v[a][0] < v[b].back()) return true;
  if (v[a][0] == v[b].back() && a < b) return true;
  return false;
}
bool tala(int a, int b) {
  if (v[b][0] < v[a][0]) return true;
  if (v[b][0] == v[a][0] && b < a) return true;
  return false;
}
bool silver(int a, int b, int c) {
  for (auto i : v[c])
    if (v[a][0] < i || (v[a][0] == i && a < c))
      if (i < v[b].back() || (i == v[b].back() && c < b)) return true;
  return false;
}
bool bronze(int a, int b) {
  if (v[a].back() < v[b].back()) return true;
  if (v[a].back() == v[b].back() && a < b) return true;
  return false;
}
pair<int, int> calc(int a, int b, int c) {
  a -= c;
  b -= c;
  a = max(a, 0);
  return {a, b};
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> mm;
  memset(dist, 63, sizeof(dist));
  for (int i = 0; i < mm; i++) {
    cin >> u >> vv >> w;
    dist[u][vv] = min(dist[u][vv], w);
    dist[vv][u] = min(dist[vv][u], w);
  }
  cin >> g1 >> g2 >> s1 >> s2;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      for (int k = 1; k <= n; k++)
        dist[j][k] = min(dist[j][k], dist[j][i] + dist[i][k]);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      if (i != j) v[i].push_back(dist[i][j]);
  for (int i = 1; i <= n; i++) {
    sort(v[i].begin(), v[i].end());
    v[i].resize(unique(v[i].begin(), v[i].end()) - v[i].begin());
  }
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j <= i; j++) {
      if (j == 0 || j == i) {
        dp[i][j] = 1;
        continue;
      }
      dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
    }
    ps[i][0] = dp[i][0];
    for (int j = 1; j <= n; j++) ps[i][j] = ps[i][j - 1] + dp[i][j];
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i != j && can(i, j)) {
        int gsb = 0, gb = 0, gs = 0, sb = 0, nowg = 0, nows = 0, nowb = 0;
        for (int k = 1; k <= n; k++) {
          if (k != i && k != j) {
            if (tala(i, k) && bronze(j, k) && silver(i, j, k))
              gsb++;
            else if (tala(i, k) && bronze(j, k))
              gb++;
            else if (tala(i, k) && silver(i, j, k))
              gs++;
            else if (silver(i, j, k) && bronze(j, k))
              sb++;
            else if (tala(i, k))
              nowg++;
            else if (silver(i, j, k))
              nows++;
            else
              nowb++;
          }
        }
        nowg++;
        for (int k = max(g1, nowg); k <= g2; k++) {
          for (int l = 0; l <= min(k - nowg, gs); l++) {
            for (int m = 0; m <= min(k - nowg - l, gb); m++) {
              long long local =
                  dp[gs][l] * dp[gb][m] * dp[gsb][k - l - m - nowg];
              if (!local) continue;
              pair<int, int> baze = calc(s1, s2, gs - l + nows);
              int tedad = gsb - k + l + m + nowg + sb;
              if (baze.second < 0) continue;
              if (baze.first == 0)
                local *= ps[tedad][baze.second];
              else
                local *= (ps[tedad][baze.second] - ps[tedad][baze.first - 1]);
              ans += local;
            }
          }
        }
      }
    }
  }
  cout << ans << '\n';
  return 0;
}
