#include <bits/stdc++.h>
using namespace std;
const int N = 60;
const int INF = 0x3f3f3f3f;
const int iinf = 1 << 30;
const long long linf = 2e18;
const int mod = 1000000007;
const double eps = 1e-7;
void douout(double x) { printf("%lf\n", x + 0.0000000001); }
template <class T>
void print(T a) {
  cout << a << endl;
  exit(0);
}
template <class T>
void chmin(T &a, T b) {
  if (a > b) a = b;
}
template <class T>
void chmax(T &a, T b) {
  if (a < b) a = b;
}
void add(long long &a, long long b) { a += b; }
void sub(int &a, int b) { a = (a - b + mod) % mod; }
void mul(int &a, int b) { a = (long long)a * b % mod; }
int addv(int a, int b) { return (a += b) >= mod ? a -= mod : a; }
int subv(int a, int b) { return (a -= b) < 0 ? a += mod : a; }
int mulv(int a, int b) { return (long long)a * b % mod; }
int read() {
  int f = 1, x = 0;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
int pw(int a, int b) {
  int s = 1;
  for (; b; b >>= 1, a = (long long)a * a % mod)
    if (b & 1) s = (long long)s * a % mod;
  return s;
}
long long f[N][N];
int g[N][N], Min[N], Max[N];
bool gold[N], silver[N], bronze[N];
int n, m, g1, g2, s1, s2;
long long ans;
signed main() {
  scanf("%d%d", &n, &m);
  memset(g, 0x3f, sizeof(g));
  for (int i = (1); i <= (n); i++) g[i][i] = 0;
  for (int i = (1); i <= (m); i++) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    g[a][b] = g[b][a] = min(g[a][b], c);
  }
  for (int k = (1); k <= (n); k++)
    for (int i = (1); i <= (n); i++)
      for (int j = (1); j <= (n); j++) chmin(g[i][j], g[i][k] + g[k][j]);
  for (int i = (1); i <= (n); i++) {
    Min[i] = INF;
    Max[i] = 0;
    for (int j = (1); j <= (n); j++)
      if (i != j) {
        g[i][j] = g[i][j] * 60 + i;
        chmax(Max[i], g[i][j]);
        chmin(Min[i], g[i][j]);
      }
  }
  scanf("%d%d%d%d", &g1, &g2, &s1, &s2);
  ans = 0;
  for (int bst = (1); bst <= (n); bst++)
    for (int wst = (1); wst <= (n); wst++)
      if (wst != bst && Min[bst] < Max[wst]) {
        for (int i = (1); i <= (n); i++) {
          gold[i] = Min[i] <= Min[bst];
          bronze[i] = Max[i] >= Max[wst];
          silver[i] = false;
          for (int j = (1); j <= (n); j++)
            if (i != j && g[i][j] > Min[bst] && g[i][j] < Max[wst]) {
              silver[i] = true;
              break;
            }
        }
        gold[bst] = true;
        silver[bst] = bronze[bst] = false;
        gold[wst] = silver[wst] = false;
        bronze[wst] = true;
        memset(f, 0, sizeof(f));
        f[0][0] = 1;
        for (int k = (1); k <= (n); k++)
          for (int i = (n); i >= (0); i--)
            for (int j = (n); j >= (0); j--)
              if (f[i][j]) {
                if (gold[k]) add(f[i + 1][j], f[i][j]);
                if (silver[k]) add(f[i][j + 1], f[i][j]);
                if (!bronze[k]) f[i][j] = 0;
              }
        for (int i = (g1); i <= (g2); i++)
          for (int j = (s1); j <= (s2); j++) add(ans, f[i][j]);
      }
  printf("%lld\n", ans);
  return 0;
}
