#include <bits/stdc++.h>
using namespace std;
int numberOfTowns, numberOfRoads, g_1, g_2, s_1, s_2;
vector<vector<int>> distances;
vector<vector<vector<long long>>> dp;
void floyd() {
  for (auto i = 0; i < numberOfTowns; i++) {
    for (auto j = 0; j < numberOfTowns; j++) {
      for (auto k = 0; k < numberOfTowns; k++) {
        distances[j][k] =
            min(distances[j][k], distances[j][i] + distances[i][k]);
        cout << endl;
      }
    }
  }
}
void makeList() {
  for (auto& v : distances) {
    sort(v.begin(), v.end());
  }
}
bool canUp(int x, int y) {
  return distances[x][1] < distances[y][1] ||
         distances[x][1] == distances[y][1] && x <= y;
}
bool canDown(int x, int y) {
  return distances[x][numberOfTowns - 1] > distances[y][numberOfTowns - 1] ||
         distances[x][numberOfTowns - 1] == distances[y][numberOfTowns - 1] &&
             x >= y;
}
bool between(int z, int x, int y) {
  int it;
  if (z > x) {
    it = lower_bound(distances[z].begin() + 1, distances[z].end(),
                     distances[x][1]) -
         distances[z].begin();
  } else {
    it = upper_bound(distances[z].begin() + 1, distances[z].end(),
                     distances[x][1]) -
         distances[z].begin();
  }
  if (it == distances[z].size()) {
    return false;
  }
  return distances[z][it] < distances[y][numberOfTowns - 1] ||
         (distances[z][it] == distances[y][numberOfTowns - 1] && z < y);
}
long long count(int gl, int bf) {
  if (distances[gl][1] > distances[bf][numberOfTowns - 1] ||
      (distances[gl][1] == distances[bf][numberOfTowns - 1] && gl > bf)) {
    return 0;
  }
  dp[0][0][0] = 1;
  for (auto i = 1; i <= numberOfTowns; i++) {
    for (auto g = 0; g <= i; g++) {
      for (auto s = 0; s <= i - g; s++) {
        dp[i][g][s] = 0;
        if (i - 1 != bf && g > 0 && canUp(i - 1, gl)) {
          dp[i][g][s] += dp[i - 1][g - 1][s];
        }
        if (i - 1 != gl && g + s < i && canDown(i - 1, bf)) {
          dp[i][g][s] += dp[i - 1][g][s];
        }
        if (s > 0 && (i - 1 != bf && i - 1 != gl) && between(i - 1, gl, bf)) {
          dp[i][g][s] += dp[i - 1][g][s - 1];
        }
      }
    }
  }
  auto res = 0ll;
  for (auto g = g_1; g <= g_2; g++)
    for (auto s = s_1; s <= s_2; s++) res += dp[numberOfTowns][g][s];
  return res;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> numberOfTowns >> numberOfRoads;
  const long long max = 1000 * 1000 + 1;
  distances =
      vector<vector<int>>(numberOfTowns, vector<int>(numberOfTowns, max));
  for (auto i = 0; i < numberOfTowns; i++) {
    distances[i][i] = 0;
  }
  for (int i = 0; i < numberOfRoads; i++) {
    int a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    distances[a][b] = distances[b][a] = c;
  }
  floyd();
  makeList();
  cin >> g_1 >> g_2 >> s_1 >> s_2;
  dp = vector<vector<vector<long long>>>(
      numberOfTowns + 1,
      vector<vector<long long>>(numberOfTowns + 1,
                                vector<long long>(numberOfTowns + 1, 0)));
  auto ans = 0ll;
  for (auto gl = 0; gl < numberOfTowns; gl++) {
    for (auto bf = 0; bf < numberOfTowns; bf++) {
      if (gl != bf) {
        ans += count(gl, bf);
      }
    }
  }
  cout << ans << endl;
  return 0;
}
