#include<stdio.h>
#include<vector>
#define nmax 351
#define oo 0x3f3f3f3f
using namespace std;
FILE *f=fopen("fmcm.in","r"), *g=fopen("fmcm.out","w");
vector<int> G[nmax];
int n,m,x,y,c,z,cap[nmax][nmax],cost[nmax][nmax],flux[nmax][nmax],viz[nmax],tata[nmax],Q[nmax];
int ok,S,D,dist[nmax],fmin;
void citire()
{
int i;
fscanf(f,"%d %d %d %d",&n,&m,&S,&D);
for(i=1;i<=m;i++)
{
fscanf(f,"%d %d %d %d",&x,&y,&c,&z);
G[x].push_back(y);
G[y].push_back(x);
cap[x][y]=c;
cost[x][y]=z;
cost[y][x]=-z;
}
fclose(f);
}
inline int bellman_ford()
{
int prim, ultim,i,fmin;
prim=ultim=1;
memset(viz,0, sizeof(viz));
memset(dist,oo,sizeof(dist));
memset(tata,-1,sizeof(tata));
Q[prim]=S;
dist[S]=0;
viz[S]=1;
while(prim<=ultim)
{
x=Q[prim++];
for(i=0;i<G[x].size();i++)
{
if(cap[x][G[x][i]]-flux[x][G[x][i]]>0 && dist[x]+cost[x][G[x][i]]<dist[G[x][i]])
{
dist[G[x][i]]=dist[x]+cost[x][G[x][i]];
tata[G[x][i]]=x;
if(!viz[G[x][i]])
{
viz[G[x][i]]=1;
Q[++ultim]=G[x][i];
}
}
}
viz[x]=0;
}
if(dist[D]!=oo)
{
fmin=oo;
ok=1;
for(i=D;i!=S;i=tata[i])
{
fmin=min(fmin,cap[tata[i]][i]-flux[tata[i]][i]);
}
for(i=D;i!=S; i=tata[i])
{
flux[tata[i]][i]+=fmin;
flux[i][tata[i]]-=fmin;
}
return fmin*dist[D];
}
return 0;
}
inline int flow()
{
int rez=0;
ok=1;
while(ok)
{
ok=0;
rez+=bellman_ford();
}
return rez;
}
int main()
{
citire();
fprintf(g,"%d\n",flow());
fclose(g);
fclose(f);
return 0;
}