#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,f,dx,dy;
int arb[250023];
struct str
{
int st;
int dr;
int y;
int val;
}a[60023];
int comp(str a,str b)
{
return a.y<b.y;
}
void update(int s,int e,int p1,int p2,int val,int nod)
{
if(s==p1&&e==p2) arb[nod]+=val;
else
{
int mij=(s+e)/2;
if(p2<=mij) update(s,mij,p1,p2,val,2*nod);
else if(p1>mij) update(mij+1,e,p1,p2,val,2*nod+1);
else
{
update(s,mij,p1,mij,val,2*nod);
update(mij+1,e,mij+1,p2,val,2*nod+1);
}
}
}
int query(int s,int e,int nr,int sum,int nod)
{
if(s==e) return (sum+arb[nod]);
else
{
int mij=(s+e)/2;
if(nr<=mij) return query(s,mij,nr,sum+arb[nod],nod*2);
return query(mij+1,e,nr,sum+arb[nod],nod*2+1);
}
}
int main()
{
// freopen ("demolish.in","r",stdin);
// freopen ("demolish.out","w",stdout);
scanf("%d%d%d%d%d",&m,&n,&f,&dx,&dy);
int l=0,x1,x2,y1,y2,cost;
for(int i=1;i<=f;i++)
{
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&cost);
++l;
a[l].st=x1;
a[l].dr=x2;
a[l].y=y1;
a[l].val=cost;
++l;
a[l].st=x1;
a[l].dr=x2;
a[l].y=y2+dy;
a[l].val=-cost;
}
sort(a+1,a+l+1,comp);
int minim=1000000000;
for(int i=1;i<=l;i++)
{
int c1=0,c2=0;
printf("%d %d %d %d\n",a[i].st,a[i].dr,c1,c2);
c1=max(1,a[i].st-dx+1);
c2=min(n-dx+1,a[i].dr+dx-1);
update(1,n-dx+1,c1,c2,1,a[i].val);
for(int j=1;j<=n-dx+1;j++)
{
if(minim>query(1,n,j,0,1)) minim=query(1,n,j,0,1);
}
}
printf("%d",minim);
}