#include <bits/stdc++.h>
using namespace std;
inline int read() {
  char ch = getchar();
  int x = 0, f = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
int d[10010];
int f[10010][1010];
deque<pair<int, int> > Q;
int main() {
  int n = read(), m = read();
  for (int i = (1); i <= (m); ++i) d[i] = read();
  sort(d + 1, d + m + 1);
  int g = read(), r = read();
  int lim = g + r;
  memset(f, 0x3f, sizeof(f));
  Q.push_back(make_pair(1, 0));
  f[1][0] = 0;
  long long ans = 1e18;
  while (!Q.empty()) {
    pair<int, int> x = Q.front();
    Q.pop_front();
    if (x.first == m) {
      ans = min(ans,
                1ll * f[x.first][x.second] * lim + (x.second ? x.second : -r));
      continue;
    }
    if (x.first != 1) {
      int dis = d[x.first] - d[x.first - 1];
      if (x.second + dis == g) {
        if (f[x.first - 1][0] > f[x.first][x.second] + 1) {
          f[x.first - 1][0] = f[x.first][x.second] + 1;
          Q.push_back(make_pair(x.first - 1, 0));
        }
      } else if (x.second + dis < g) {
        if (f[x.first - 1][x.second + dis] > f[x.first][x.second]) {
          f[x.first - 1][x.second + dis] = f[x.first][x.second];
          Q.push_front(make_pair(x.first - 1, x.second + dis));
        }
      }
    }
    int dis = d[x.first + 1] - d[x.first];
    if (x.second + dis == g) {
      if (f[x.first + 1][0] > f[x.first][x.second] + 1) {
        f[x.first + 1][0] = f[x.first][x.second] + 1;
        Q.push_back(make_pair(x.first + 1, 0));
      }
    } else if (x.second + dis < g) {
      if (f[x.first + 1][x.second + dis] > f[x.first][x.second]) {
        f[x.first + 1][x.second + dis] = f[x.first][x.second];
        Q.push_front(make_pair(x.first + 1, x.second + dis));
      }
    }
  }
  if (ans > 1e10)
    puts("-1");
  else
    printf("%lld\n", ans);
}
