//#include "stdafx.h"
#include<stdio.h>
#include<algorithm>
#define NMAX 351
#define inf 10000000
using namespace std;
int x[NMAX][NMAX],dd,viz[NMAX],sol,dist[NMAX],i,j,n,m,k,l,a,s,b,d,nod,in,sf,c,rez,flux[NMAX][NMAX],y[NMAX][NMAX];
struct kkt
{
int X,Y,Z;
} q[NMAX*NMAX];
void solve()
{
in=sf=1;
a=0;
q[1].X=s;
q[1].Z=inf;
for (i=1;i<=n;i++)
dist[i]=inf , viz[i]=0;
dist[s]=0;
viz[s]=1;
while (in<=sf)
{
nod=q[in].X;
for (i=1;i<=n;i++)
if (x[nod][i]||x[i][nod])
if (dist[i]>dist[nod]+y[nod][i])
{
rez=x[nod][i]-flux[nod][i];
if (rez)
{
dist[i]=dist[nod]+y[nod][i];
if (!viz[i])
{
sf++;
q[sf].X=i;
q[sf].Y=in;
q[sf].Z=min(rez,q[in].Z);
viz[i]=sf;
}
else
{
q[viz[i]].X=i;
q[viz[i]].Y=in;
q[viz[i]].Z=min(rez,q[in].Z);
}
}
}
viz[nod]=0;
in++;
}
if (dist[d]==inf)
return ;
while (q[sf].X!=d)
sf--;
a=1;
rez=q[sf].Z;
while (sf)
{
nod=q[sf].X;
k=q[sf].Y;
flux[q[k].X][nod]+=rez;
sol+=rez*y[q[k].X][nod];
flux[nod][q[k].X]-=rez;
sf=q[sf].Y;
}
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&s,&d);
for (i=1;i<=m;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&dd);
x[a][b]=c;
y[a][b]=dd;
y[b][a]=-dd;
}
a=1;
while (a)
solve();
printf("%d\n",sol);
return 0;
}