#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
#include <queue>

struct TrainSpeed {
	long long int normal, semiExpress, express;
};
static TrainSpeed Speed;
static long long int TargetTime;
long long int f(const long long int from, const long long int to, const long long int reachTime) {
	auto restTime = TargetTime - reachTime;
	if (restTime < 0) return 0;
	auto r = restTime / Speed.normal;
	if (to - from - 1 >= r) return r;
	else return to - from - 1;
}
long long int additionalStopIfPutStation(const long long int from, const long long int to, const long long int reachTime) {
	if (reachTime >= TargetTime) return 0;
	auto suspect = f(from, to, reachTime);
	if (from + suspect >= to) return 0;
	auto near = (TargetTime - reachTime - suspect * Speed.semiExpress) / Speed.normal;
	auto far = (TargetTime - reachTime - (suspect + 1) * Speed.semiExpress) / Speed.normal;
	if (near < far + 1) {
		if (TargetTime < reachTime + (suspect + 1) * Speed.semiExpress) return 0;
		if (to - from - 1 - suspect <= far + 1) return to - from - 1 - suspect;
		else return far + 1;
	}
	else {
		if (near <= 0) return 0;
		if (to - from - 1 - suspect <= near) return to - from - 1 - suspect;
		else return near;
	}
}
struct Section {
	long long int from, to;
	long long int reachTime;
	long long int additionalCount;
	Section() :from{}, to{}, reachTime{}, additionalCount{}{};
	Section(long long int from, long long int to, long long int reachTime) : from{ from }, to{ to }, reachTime{ reachTime }, additionalCount{ additionalStopIfPutStation(from, to, reachTime) } {};
	Section split() const {
		if (additionalCount < 0) throw 0;
		auto suspect = f(from, to, reachTime);
		auto near = (TargetTime - reachTime - suspect * Speed.semiExpress) / Speed.normal;
		auto far = (TargetTime - reachTime - (suspect + 1) * Speed.semiExpress) / Speed.normal;
		if (near < far + 1) {
			if (far + 1 <= 0) throw 0;
			return Section(from + suspect + 1, to, reachTime + (suspect + 1) * Speed.semiExpress);
		}
		else {
			if (near <= 0) throw 0;
			return Section(from + suspect, to, reachTime + suspect * Speed.semiExpress);
		}
	}
	bool operator<(const Section &that) const {
		return additionalCount < that.additionalCount;
	}
	bool operator>(const Section &that) const {
		return additionalCount > that.additionalCount;
	}
};
long long int reachableStop(const long long int from, const long long int to) {
	auto restTime = TargetTime - (from - 1) * Speed.express;
	if (restTime <= 0) return 0;
	else if (restTime / Speed.normal + 1 <= to - from) return restTime / Speed.normal + 1;
	else return to - from;
}
int main() {
	int n, m, k;
	std::cin >> n >> m >> k;
	std::cin >> Speed.normal >> Speed.express >> Speed.semiExpress;
	std::cin >> TargetTime;
	auto restSemiExpress = k - m;
	long long int sum = -1;
	if ((n - 1) * Speed.express <= TargetTime) ++sum;
	std::priority_queue<Section, std::vector<Section>, std::less<Section>> queue;
	{
		long long int prev, current;
		std::cin >> prev;
		for (auto i = 1; i < m; ++i) {
			std::cin >> current;
			queue.push(Section(prev, current, (prev - 1) * Speed.express));
			sum += reachableStop(prev, current);
			prev = current;
		}
	}
	for (auto i = 0; i < restSemiExpress && !queue.empty(); ++i) {
		Section top = queue.top();
		queue.pop();
		sum += top.additionalCount;
		if (top.additionalCount > 0) {
			auto next = top.split();
			if (next.additionalCount > 0) queue.push(next);
		}
	}
	std::cout << sum << std::endl;
}


Measured memory_bytes: 3204