#include<stdio.h>
#define N 360
#define i8 2000000000
struct nod{int inf;nod *urm;};
struct nodc{int vvv,ccc;nodc *next;};
nod *p[N];
nodc *prim,*ultim;
int n,m,s,d,nc,nv,cc,cv,fd,fm,
cap[N][N],cost[N][N],flow[N][N],dad[N],c[N];
long long sol,lf,lc;
void readd(),flux(),enque(int V,int C),deque();
int main()
{
readd();
flux();
return 0;
}
void readd()
{ int i,xx,yy,cp,vv;nod *paux;
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",&xx,&yy,&cp,&vv);
paux=new nod;paux->inf=xx;paux->urm=p[yy];p[yy]=paux;
paux=new nod;paux->inf=yy;paux->urm=p[xx];p[xx]=paux;
cap[xx][yy]=cp;cost[xx][yy]=vv;cost[yy][xx]=-vv;
}
prim=new nodc;prim->next=0;ultim=prim;
}
void flux()
{ nod *paux;
for(;;)
{ for(nc=1;nc<=n;nc++){c[nc]=i8;dad[nc]=0;}c[s]=0;enque(s,0);
while(prim->next)
{ nc=prim->next->vvv;cc=prim->next->ccc;
if(cc<=c[nc])
for(paux=p[nc];paux;paux=paux->urm)
{ nv=paux->inf;
if(cap[nc][nv]-flow[nc][nv])
{ cv=cc+cost[nc][nv];
if(cv<c[nv])
{ c[nv]=cv;dad[nv]=nc;enque(nv,cv);}
}
}
deque();
}
if(c[d]==i8){printf("%lld",sol);return;}
fd=i8;
for(nc=d;dad[nc];nc=dad[nc])
{ fm=cap[dad[nc]][nc]-flow[dad[nc]][nc];
fd=(fd<fm)?fd:fm;
}
sol+=c[d]*fd;
for(nc=d;dad[nc];nc=dad[nc])
{ flow[dad[nc]][nc]+=fd;flow[nc][dad[nc]]-=fd;}
}
}
void enque(int V,int C)
{
nodc *paux;
paux=new nodc;paux->vvv=V;paux->ccc=C;paux->next=0;
ultim->next=paux;ultim=paux;
}
void deque()
{
nodc *paux;
paux=prim;prim=prim->next;delete paux;
}