#include <bits/stdc++.h>
using namespace std;
long long n, m, g1, g2, s1, s2;
const long long max_n = 52;
vector<pair<long long, long long>> ad_list[max_n];
long long d[max_n][max_n][max_n];
long long save[max_n];
bool mark[max_n];
vector<long long> dis[max_n];
set<pair<long long, long long>> st;
void update(long long v) {
  mark[v] = 1;
  for (long long i = 0; i < ad_list[v].size(); i++) {
    long long u = ad_list[v][i].first;
    long long w = ad_list[v][i].second;
    if (mark[u]) continue;
    if (save[u] == -1 || save[u] > save[v] + w) {
      if (save[u] != -1) st.erase({save[u], u});
      save[u] = save[v] + w;
      st.insert({save[u], u});
    }
  }
}
long long find_min() {
  pair<long long, long long> temp = *st.begin();
  st.erase(temp);
  return temp.second;
}
void dijk(long long root) {
  fill(mark, mark + n, 0);
  fill(save, save + n, -1);
  save[root] = 0;
  update(root);
  long long mini;
  while (!st.empty()) {
    mini = find_min();
    update(mini);
  }
  for (long long i = 0; i < n; i++) {
    if (i == root) continue;
    dis[root].push_back(save[i]);
  }
  sort(dis[root].begin(), dis[root].end());
  dis[root].resize(unique(dis[root].begin(), dis[root].end()) -
                   dis[root].begin());
}
bool lesss(long long min_g, long long ind, long long x) {
  if (dis[min_g][0] > x) return true;
  if (dis[min_g][0] < x) return false;
  if (min_g < ind) return false;
  return true;
}
bool more(long long max_b, long long ind, long long x) {
  if (dis[max_b][dis[max_b].size() - 1] < x) return true;
  if (dis[max_b][dis[max_b].size() - 1] > x) return false;
  if (max_b > ind) return false;
  return true;
}
long long get(long long min_g, long long max_b) {
  if (lesss(min_g, max_b, dis[max_b][dis[max_b].size() - 1])) return 0;
  for (long long i = 0; i <= n; i++)
    for (long long j = 0; j <= n; j++)
      for (long long w = 0; w <= n; w++) d[i][j][w] = 0;
  for (long long i = 0; i < n; i++) {
    bool fg, fs, fb;
    fg = fs = fb = 0;
    for (long long j = 0; j < dis[i].size(); j++) {
      if (i == min_g) {
        fg = 1;
        continue;
      }
      if (i == max_b) {
        fb = 1;
        continue;
      }
      if (lesss(min_g, i, dis[i][j])) fg = 1;
      if (more(max_b, i, dis[i][j])) fb = 1;
      if (dis[min_g][0] > dis[i][j]) continue;
      if (dis[min_g][0] == dis[i][j] && min_g >= i) continue;
      if (dis[max_b][dis[max_b].size() - 1] < dis[i][j]) continue;
      if (dis[max_b][dis[max_b].size() - 1] == dis[i][j] && max_b <= i)
        continue;
      fs = 1;
    }
    if (i == 0) {
      if (fg) d[i][0][1] = 1;
      if (fb) d[i][0][0] = 1;
      if (fs) d[i][1][0] = 1;
      continue;
    }
    for (long long s = 0; s <= n; s++)
      for (long long g = 0; g <= n; g++) {
        if (fb) d[i][s][g] += d[i - 1][s][g];
        if (fs && s > 0) d[i][s][g] += d[i - 1][s - 1][g];
        if (fg && g > 0) d[i][s][g] += d[i - 1][s][g - 1];
      }
  }
  long long ret = 0;
  for (long long i = g1; i <= g2; i++)
    for (long long j = s1; j <= s2; j++) ret += d[n - 1][j][i];
  return ret;
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0);
  {
    cin >> n >> m;
    long long a, b, c;
    for (long long i = 0; i < m; i++) {
      cin >> a >> b >> c;
      a--;
      b--;
      ad_list[a].push_back({b, c});
      ad_list[b].push_back({a, c});
    }
  }
  {
    for (long long i = 0; i < n; i++) dijk(i);
    cin >> g1 >> g2;
    cin >> s1 >> s2;
  }
  long long ans = 0;
  for (long long i = 0; i < n; i++)
    for (long long j = 0; j < n; j++) {
      if (i == j) continue;
      long long t = get(i, j);
      ans += t;
    }
  cout << ans << endl;
  return 0;
}
