#include <bits/stdc++.h>
using namespace std;
const int N = 50 + 2, inf = 1e9 + 10;
int dis[N][N], isval[N][4], n, m, g1, g2, s1, s2;
vector<int> v[N];
long long ans, dp[N][N][N];
void getValid(pair<int, int> fr, pair<int, int> sd) {
  memset(isval, 0, sizeof(isval));
  for (int i = 0; i < n; i++) {
    if (i == fr.second) {
      isval[i][0] = 1;
      continue;
    }
    if (i == sd.second) {
      isval[i][2] = 1;
      continue;
    }
    for (int j = 0; j < v[i].size(); j++) {
      pair<int, int> p = {v[i][j], i};
      if (p < fr) isval[i][0] = 1;
      if (p > sd) isval[i][2] = 1;
      if (p > fr && p < sd) isval[i][1] = 1;
    }
  }
  return;
}
void getAns() {
  memset(dp, 0, sizeof(dp));
  dp[0][0][0] = 1;
  for (int i = 1; i <= n; i++) {
    for (int g = 0; g <= g2; g++) {
      for (int s = 0; s <= s2; s++) {
        if (isval[i - 1][0] && g > 0) dp[i][g][s] += dp[i - 1][g - 1][s];
        if (isval[i - 1][1] && s > 0) dp[i][g][s] += dp[i - 1][g][s - 1];
        if (isval[i - 1][2]) dp[i][g][s] += dp[i - 1][g][s];
        if (i == n && g >= g1 && g <= g2 && s >= s1 && s <= s2)
          ans += dp[i][g][s];
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  memset(dis, 63, sizeof(dis));
  for (int i = 0; i < m; i++) {
    int x, y, c;
    cin >> x >> y >> c;
    x--, y--;
    dis[x][y] = dis[y][x] = min(dis[x][y], c);
  }
  cin >> g1 >> g2 >> s1 >> s2;
  for (int k = 0; k < n; k++)
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (j != i) {
        v[i].push_back(dis[i][j]);
      }
    }
    sort(v[i].begin(), v[i].end());
  }
  for (int a = 0; a < n; a++) {
    for (int b = 0; b < n; b++) {
      if (a == b) continue;
      getValid(make_pair(v[a][0], a), make_pair(v[b].back(), b));
      getAns();
    }
  }
  cout << ans;
  return 0;
}
