#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <functional>
#include <tuple>
using namespace std;
long long H, W, A, B, C, N, x[100009], y[100009], dist[509][509][4], dp[509][509], dx[4] = { 0,1,0,-1 }, dy[4] = { 1,0,-1,0 };
priority_queue<tuple<long long, int, int>, vector<tuple<long long, int, int>>, greater<tuple<long long, int, int>>>q;
priority_queue<tuple<long long, int, int, int>, vector<tuple<long long, int, int, int>>, greater<tuple<long long, int, int, int>>>Q;
int main() {
	cin >> H >> W >> A >> B >> C >> N;
	for (int i = 0; i <= H; i++) { for (int j = 0; j <= W; j++)dp[i][j] = (1LL << 62); }
	for (int i = 1; i <= N; i++) { cin >> x[i] >> y[i]; if (i < N) dp[x[i]][y[i]] = 0; q.push(make_tuple(0, x[i], y[i])); }
	while (!q.empty()) {
		long long a1 = get<0>(q.top()), a2 = get<1>(q.top()), a3 = get<2>(q.top()); q.pop();
		for (int i = 0; i < 4; i++) {
			int cx = a2 + dx[i], cy = a3 + dy[i];
			if (cx < 0 || cx > H || cy < 0 || cy > W)continue;
			if (dp[cx][cy] > a1 + C) {
				dp[cx][cy] = a1 + C; q.push(make_tuple(dp[cx][cy], cx, cy));
			}
		}
	}
	for (int i = 0; i <= H; i++) { for (int j = 0; j <= W; j++) { for (int k = 0; k < 4; k++)dist[i][j][k] = (1LL << 62); } }
	dist[x[1]][y[1]][1] = 0; Q.push(make_tuple(0LL, x[1], y[1], 1));
	while (!Q.empty()) {
		long long a1 = get<0>(Q.top()), a2 = get<1>(Q.top()), a3 = get<2>(Q.top()), a4 = get<3>(Q.top()); Q.pop();
		if (a4 == 0) {
			if (dist[a2][a3][1] > a1 + dp[a2][a3]) { dist[a2][a3][1] = a1 + dp[a2][a3]; Q.push(make_tuple(dist[a2][a3][1], a2, a3, 1)); }
		}
		if (a4 == 1) {
			if (dist[a2][a3][2] > a1 + B) { dist[a2][a3][2] = a1 + B; Q.push(make_tuple(dist[a2][a3][2], a2, a3, 2)); }
			if (dist[a2][a3][3] > a1 + B) { dist[a2][a3][3] = a1 + B; Q.push(make_tuple(dist[a2][a3][3], a2, a3, 3)); }
			if (a2 - 1 >= 0 && dist[a2 - 1][a3][1] > a1 + C) { dist[a2 - 1][a3][1] = a1 + C; Q.push(make_tuple(dist[a2 - 1][a3][1], a2 - 1, a3, 1)); }
			if (a2 + 1 <= H && dist[a2 + 1][a3][1] > a1 + C) { dist[a2 + 1][a3][1] = a1 + C; Q.push(make_tuple(dist[a2 + 1][a3][1], a2 + 1, a3, 1)); }
			if (a3 - 1 >= 0 && dist[a2][a3 - 1][1] > a1 + C) { dist[a2][a3 - 1][1] = a1 + C; Q.push(make_tuple(dist[a2][a3 - 1][1], a2, a3 - 1, 1)); }
			if (a3 + 1 <= W && dist[a2][a3 + 1][1] > a1 + C) { dist[a2][a3 + 1][1] = a1 + C; Q.push(make_tuple(dist[a2][a3 + 1][1], a2, a3 + 1, 1)); }
			if (dist[a2][a3][0] > a1) { dist[a2][a3][0] = a1; Q.push(make_tuple(dist[a2][a3][0], a2, a3, 0)); }
		}
		if (a4 == 2) {
			if (a2 - 1 >= 0 && dist[a2 - 1][a3][2] > a1 + A) { dist[a2 - 1][a3][2] = a1 + A; Q.push(make_tuple(dist[a2 - 1][a3][2], a2 - 1, a3, 2)); }
			if (a2 + 1 <= H && dist[a2 + 1][a3][2] > a1 + A) { dist[a2 + 1][a3][2] = a1 + A; Q.push(make_tuple(dist[a2 + 1][a3][2], a2 + 1, a3, 2)); }
			if (dist[a2][a3][0] > a1) { dist[a2][a3][0] = a1; Q.push(make_tuple(dist[a2][a3][0], a2, a3, 0)); }
		}
		if (a4 == 3) {
			if (a3 - 1 >= 0 && dist[a2][a3 - 1][3] > a1 + A) { dist[a2][a3 - 1][3] = a1 + A; Q.push(make_tuple(dist[a2][a3 - 1][3], a2, a3 - 1, 3)); }
			if (a3 + 1 <= W && dist[a2][a3 + 1][3] > a1 + A) { dist[a2][a3 + 1][3] = a1 + A; Q.push(make_tuple(dist[a2][a3 + 1][3], a2, a3 + 1, 3)); }
			if (dist[a2][a3][0] > a1) { dist[a2][a3][0] = a1; Q.push(make_tuple(dist[a2][a3][0], a2, a3, 0)); }
		}
	}
	cout << dist[x[N]][y[N]][0] << endl;
	return 0;
}

Measured memory_bytes: 23552