#include <bits/stdc++.h>
using namespace std;
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii ;
typedef pair<ll, ll> pll ;
typedef vector<pii> vii ;
typedef vector<int> veci ;
typedef vector<pll> vll ;
typedef vector<ll> vecll;
// find_by_order order_of_key
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define F first
#define S second
#define pb push_back
#define endl '\n'
#define Mp make_pair
#define all(x) x.begin(), x.end()
#define debug(x) cerr << #x << " = " << x << endl
#define set_dec(x) cout << fixed << setprecision(x);
#define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io freopen("in.txt" , "r" , stdin) ; freopen("out.txt" , "w" , stdout);
#define lb lower_bound
#define ub upper_bound
#define for1(n) for(int i=1;i<=n;i++)
#define for0(n) for(int i=0;i<n;i++)
#define forn(n) for(int i=n;i>0;i--)
#define pq priority_queue <pair<ll,pair<pii,int>>, vector<pair<ll,pair<pii,int>>>, greater<pair<ll,pair<pii,int>>>>
const ll mod = 1e9+7 ;// 998244353 ;// 1e9+9;
ll inf=1e18;
const int N=500+10,L=21,bs=701,NN=1e6;
int B[N],C[N],D[N],E[N],n,m,k,q,dp[N],is[N][N],vis[N],w,h,a,b,c;
vector<int>g[N];
pii A[N];
ll dist[N][N][5],distt[N][N];
int dix[]={-1,0,1,0};
int diy[]={0,1,0,-1};
void dij(int x,int y){
dist[x][y][4]=0;
pq q;q.push({0,{{x,y},4}});
while(q.size()){
ll w=q.top().F;int x=q.top().S.F.F,y=q.top().S.F.S,o=q.top().S.S;q.pop();
if(dist[x][y][o]!=w)continue;
if(o<4){
if(dist[x][y][4]>w+distt[x][y]){
dist[x][y][4]=w+distt[x][y];
q.push({w+distt[x][y],{{x,y},4}});
}
int xx=x+dix[o],yy=y+diy[o];
if(xx==0 || xx==h+1 || yy==0 || yy==w+1)continue;
if(dist[xx][yy][o]>w+a){
dist[xx][yy][o]=w+a;
q.push({w+a,{{xx,yy},o}});
}
continue;
}
for(int o=0;o<4;o++){
if(dist[x][y][o]>w+b){
dist[x][y][o]=w+b;
q.push({w+b,{{x,y},o}});
}
int xx=x+dix[o],yy=y+diy[o];
if(xx==0 || xx==h+1 || yy==0 || yy==w)continue;
if(dist[xx][yy][4]>w+c){
dist[xx][yy][4]=w+c;
q.push({w+c,{{xx,yy},4}});
}
}
}
}
int main(){
fast_io
cin>>h>>w;
cin>>a>>b>>c;
cin>>n;
for1(h)for(int j=1;j<=w;j++)distt[i][j]=inf;
queue<pii>q;
for1(n){
int x,y;cin>>x>>y;
A[i]={x,y};
distt[x][y]=0;q.push({x,y});
}
while(q.size()){
int x=q.front().F,y=q.front().S;q.pop();
for0(4){
int xx=x+dix[i],yy=y+diy[i];
if(distt[xx][yy]>distt[x][y]+c){
distt[xx][yy]=distt[x][y]+c;
q.push({xx,yy});
}
}
}
for1(h)for(int j=1;j<=w;j++){
for(int t=0;t<5;t++)
dist[i][j][t]=inf;
}
dij(A[1].F,A[1].S);
cout<<dist[A[n].F][A[n].S][4]<<endl;
}