#include<cstdio>
#include<algorithm>
#include<cstring>
#define fi first
#define se second
#include<queue>
#define INF 0x3f3f3f3f
#include<vector>
#define N 400
#define FOR(a,b,c) for(int a=b;a<=c;a++)
using namespace std;
queue<short int> Q;
vector<pair<short int,short int> > v[N];
pair<short int,short int> des;
short int Cp[N][N],T[N],F[N][N];
bool inQ[N];
int qsize,i,n,m,minim,cost,nod,S,D,c,z,x,y,C[N];
inline void read()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&S,&D);
FOR(i,1,m)
{
scanf("%d%d%d%d",&x,&y,&c,&z);
Cp[x][y]=c;
v[x].push_back(make_pair(y,z));
v[y].push_back(make_pair(x,-z));
}
}
inline void init()
{
memset(inQ,0,sizeof(inQ));
memset(C,INF,sizeof(C));
qsize=1; Q.push(S); inQ[S]=1;
C[S]=0; minim=INF;
}
inline bool fmcm()
{
init();
while(qsize)
{
nod=Q.front();
Q.pop();
qsize--;
inQ[nod]=0;
for(vector<pair<short int,short int> >::iterator des=v[nod].begin();des!=v[nod].end();des++)
FOR(i,0,v[nod].size()-1)
{
if(Cp[nod][des->fi]>F[nod][des->fi]&&C[des->fi]>C[nod]+des->se)
{
C[des->fi]=C[nod]+des->se;
T[des->fi]=nod;
if(!inQ[des->fi])
{
inQ[des->fi]=1;
Q.push(des->fi);
++qsize;
}
}
}
}
if(C[D]!=INF)
{
for(nod=D;T[nod];nod=T[nod])
minim=min(minim,Cp[T[nod]][nod]-F[T[nod]][nod]);
for(nod=D;T[nod];nod=T[nod])
{
F[T[nod]][nod]+=minim;
F[nod][T[nod]]-=minim;
}
}
return (C[D]!=INF);
}
inline void solve()
{
while(fmcm())
cost+=minim*C[D];
printf("%d",cost);
}
int main ()
{
read();
solve();
return 0;
}