#include <bits/stdc++.h>
using namespace std;
const int MAXN = 50 + 10;
int n, m, adj[MAXN][MAXN], G1, G2, S1, S2;
pair<int, int> MIN[MAXN], MAX[MAXN];
vector<pair<int, int>> node[MAXN];
bool can[MAXN][MAXN][MAXN];
long long answer, dp[MAXN][MAXN][MAXN];
int main() {
  ios::sync_with_stdio(0);
  memset(adj, 63, sizeof(adj));
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    u--;
    v--;
    adj[u][v] = adj[v][u] = w;
  }
  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++)
        adj[i][j] = min(adj[i][j], adj[i][k] + adj[k][j]);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++)
      if (i != j) node[i].push_back(pair<int, int>(adj[i][j], i));
    sort(node[i].begin(), node[i].end());
    MIN[i] = node[i][0];
    MAX[i] = node[i][n - 2];
  }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      for (int k = 0; k < n; k++) {
        if (i == j || i == k || j == k) continue;
        int l = upper_bound(node[k].begin(), node[k].end(), MIN[i]) -
                node[k].begin();
        int r = lower_bound(node[k].begin(), node[k].end(), MAX[j]) -
                node[k].begin() - 1;
        if (l <= r) can[i][j][k] = true;
      }
  for (int last_min = 0; last_min < n; last_min++)
    for (int first_max = 0; first_max < n; first_max++) {
      if (last_min == first_max || MIN[last_min] >= MAX[first_max]) continue;
      memset(dp, 0, sizeof(dp));
      dp[0][0][0] = 1;
      for (int v = 0; v < n; v++)
        for (int i = 0; i <= (v + 1); i++)
          for (int j = 0; (j + i) <= (v + 1); j++) {
            if (v == last_min) {
              if (i) dp[v + 1][i][j] += dp[v][i - 1][j];
              continue;
            }
            if (v == first_max) {
              if (j) dp[v + 1][i][j] += dp[v][i][j - 1];
              continue;
            }
            if (MIN[v] < MIN[last_min] && i) dp[v + 1][i][j] += dp[v][i - 1][j];
            if (MAX[v] > MAX[first_max] && j)
              dp[v + 1][i][j] += dp[v][i][j - 1];
            if (can[last_min][first_max][v]) dp[v + 1][i][j] += dp[v][i][j];
          }
      for (int g = 0; g <= n; g++)
        for (int b = 0; (g + b) <= n; b++)
          if (G1 <= g && g <= G2 && S1 <= (n - g - b) && (n - g - b) <= S2)
            answer += dp[n][g][b];
    }
  cout << answer << endl;
  return 0;
}
