#include<bits/stdc++.h>
#define inf 1000000000
using namespace std;
int n,m,SS,TT,u,v,x,y,cnt=-1,q[50010],head[50010],dep[50010],cur[50100],ss,S,T,d[50010];
struct node{int to,next,w;}edge[1000010];
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void Add(int x,int y,int z)
{
edge[++cnt].to=y,edge[cnt].next=head[x],edge[cnt].w=z,head[x]=cnt;
edge[++cnt].to=x,edge[cnt].next=head[y],edge[cnt].w=0,head[y]=cnt;
}
inline bool bfs(int s,int t)
{
queue<int> q;memset(dep,0,sizeof(dep));dep[s]=1;q.push(s);
while(!q.empty())
{
int x=q.front();q.pop();
for(register int i=head[x];~i;i=edge[i].next)
{
if(dep[edge[i].to]==0&&edge[i].w>0) dep[edge[i].to]=dep[x]+1,q.push(edge[i].to);
if(edge[i].to==t) return 1;
}
}
return 0;
}
inline int work(int k,int f,int t)
{
if (k==t) return f;
int used=0,fl=f;
for (int i=cur[k];~i;i=edge[i].next)
if (dep[k]+1==dep[edge[i].to]&&edge[i].w)
{
int w=work(edge[i].to,min(f,edge[i].w),t);
if(!w) dep[w]=0;f-=w;edge[i].w-=w;edge[i^1].w+=w;
used=i;if (!f) {cur[x]=i;return fl;}
}
cur[x]=used;return fl-f;
}
int main()
{
n=read();m=read();SS=read();TT=read();S=0;T=n+1;memset(head,-1,sizeof(head));
for(register int i=1;i<=m;i++)
{
u=read();v=read();x=read();y=read();
Add(u,v,y-x);d[u]-=x;d[v]+=x;
}
for(register int i=1;i<=n;i++)
if(d[i]>0) Add(S,i,d[i]),ss+=d[i];
else if(d[i]<0) Add(i,T,-d[i]);
int maxflow=0;
while(bfs(0,T)) memcpy(cur,head,sizeof(head)),maxflow+=work(0,inf,T);Add(TT,SS,inf);
while(bfs(0,T)) memcpy(cur,head,sizeof(head)),maxflow+=work(0,inf,T);
if(maxflow!=ss) puts("please go home to sleep");
else cout<<edge[cnt].w;
return 0;
}
RT,超时29分