#include <bits/stdc++.h>
using namespace std;
struct node {
  int t;
  int t2;
  int pos;
};
long long ans = 1e18;
int s, g, r;
int vis[10005][1005];
queue<node> q;
int d[10005];
int n, m;
node Back(node u) {
  if (u.pos == 1) return {-1, -1, -1};
  int w = d[u.pos] - d[u.pos - 1];
  if (w + u.t > g) return {-1, -1, -1};
  u.pos--;
  if (w + u.t == g) {
    u.t = 0;
    u.t2++;
  } else
    u.t += w;
  if (vis[u.pos][u.t] != -1 && vis[u.pos][u.t] <= u.t2) return {-1, -1, -1};
  vis[u.pos][u.t] = u.t2;
  return u;
}
node Go(node u) {
  int w = d[u.pos + 1] - d[u.pos];
  if (w + u.t > g) return {-1, -1, -1};
  u.pos++;
  if (w + u.t == g && u.pos != m) {
    u.t = 0;
    u.t2++;
  } else
    u.t += w;
  if (vis[u.pos][u.t] != -1 && vis[u.pos][u.t] <= u.t2) return {-1, -1, -1};
  vis[u.pos][u.t] = u.t2;
  return u;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) scanf("%d", &d[i]);
  memset(vis, -1, sizeof(vis));
  scanf("%d%d", &g, &r);
  sort(d + 1, d + 1 + m);
  if (d[m] != n) d[++m] = n;
  if (d[1] > g) {
    cout << -1 << '\n';
    return 0;
  }
  if (d[1] == n) {
    cout << d[1] << '\n';
    return 0;
  }
  s = g + r;
  if (d[1] == g) {
    q.push({0, 1, 1});
    vis[1][0] = 1;
  } else {
    q.push({d[1], 0, 1});
    vis[1][d[1]] = 0;
  }
  while (!q.empty()) {
    node u = q.front();
    q.pop();
    if (u.pos != 1) {
      node v = Back(u);
      if (v.pos != -1) q.push(v);
    }
    node v = Go(u);
    if (v.pos == m) {
      if (v.t == 0) ans = min(ans, 1ll * v.t2 * s - r);
      ans = min(ans, v.t + 1ll * v.t2 * s);
      continue;
    }
    if (v.pos != -1) q.push(v);
  }
  if (ans == 1e18)
    cout << -1 << '\n';
  else
    cout << ans << '\n';
}
