#include <bits/stdc++.h>
using namespace std;
int const N = 50 + 5, M = 1000 + 20, inf = 1e9 + 20;
int n, m, g1, g2, s1, s2;
long long ans, dp[N][N][N];
vector<int> g[N], vec[N];
struct edge {
  int u, v, w;
} e[M];
void dijk(int sta) {
  set<pair<int, int> > st;
  int dist[N];
  fill(dist, dist + n, inf);
  dist[sta] = 0;
  st.insert({dist[sta], sta});
  while ((int)st.size()) {
    int v = st.begin()->second;
    st.erase(st.begin());
    for (int ed : g[v]) {
      int u = e[ed].v ^ e[ed].u ^ v, w = e[ed].w;
      if (dist[v] + w < dist[u]) {
        st.erase({dist[u], u});
        dist[u] = dist[v] + w;
        st.insert({dist[u], u});
      }
    }
  }
  for (int i = 0; i < n; i++)
    if (i != sta) vec[sta].push_back(dist[i]);
  sort(vec[sta].begin(), vec[sta].end());
  vec[sta].resize(unique(vec[sta].begin(), vec[sta].end()) - vec[sta].begin());
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int &u = e[i].u, &v = e[i].v;
    cin >> u >> v >> e[i].w;
    u--, v--;
    g[u].push_back(i);
    g[v].push_back(i);
  }
  cin >> g1 >> g2 >> s1 >> s2;
  for (int i = 0; i < n; i++) dijk(i);
  for (int MN = 0; MN < n; MN++) {
    for (int MX = 0; MX < n; MX++) {
      if (MN == MX) continue;
      memset(dp, 0, sizeof dp);
      dp[0][0][0] = 1;
      for (int i = 0; i < n; i++) {
        bool f1 = 0, f2 = 0, f3 = 0;
        if (i == MN)
          f1 = 1;
        else if (i == MX)
          f3 = 1;
        else {
          for (int x : vec[i]) {
            if (pair<int, int>(x, i) < pair<int, int>(vec[MN][0], MN)) f1 = 1;
            if (pair<int, int>(x, i) > pair<int, int>(vec[MN][0], MN) &&
                pair<int, int>(x, i) < pair<int, int>(vec[MX].back(), MX))
              f2 = 1;
            if (pair<int, int>(x, i) > pair<int, int>(vec[MX].back(), MX))
              f3 = 1;
          }
        }
        if (f1) {
          for (int x = 1; x <= i + 1; x++)
            for (int y = 0; x + y <= i + 1; y++) {
              int z = i + 1 - x - y;
              dp[x][y][z] += dp[x - 1][y][z];
            }
        }
        if (f2) {
          for (int x = 0; x <= i; x++)
            for (int y = 1; x + y <= i + 1; y++) {
              int z = i + 1 - x - y;
              dp[x][y][z] += dp[x][y - 1][z];
            }
        }
        if (f3) {
          for (int x = 0; x <= i; x++)
            for (int y = 0; x + y <= i; y++) {
              int z = i + 1 - x - y;
              dp[x][y][z] += dp[x][y][z - 1];
            }
        }
      }
      for (int x = 0; x <= n; x++)
        for (int y = 0; y <= n; y++) {
          int z = n - x - y;
          if (g1 <= x && x <= g2 && s1 <= y && y <= s2) ans += dp[x][y][z];
        }
    }
  }
  cout << ans << '\n';
}
