#include <stdio.h>
#include <vector>
#include <queue>
#include <string.h>
#define inf 500000000
using namespace std;
int n, m, i, k, x, y, z, d[405], t[405], f[405][405], c[405][405], r, cost, j, s, dv[405], dn[405], D, e, a;
bool o[405];
vector<pair<int, int> > G[405];
queue<int> Q;
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > H;
void citire()
{
int i, cp;
scanf("%i%i%i%i", &n, &m, &s, &e);
for (i = 1; i <= m; i++) {
scanf("%i%i%i%i", &x, &y, &cp, &z);
c[x][y] = cp;
G[x].push_back(make_pair(y, z));
G[y].push_back(make_pair(x, -z));
}
}
void bellmanford()
{
int i, z, x, y;
for (i = 1; i <= n; i++) dv[i] = inf;
Q.push(s);
o[s] = 1;
dv[s] = 0;
while (!Q.empty()) {
x = Q.front();
Q.pop();
o[x] = 0;
z = G[x].size();
for (i = 0; i < z; i++) {
y = G[x][i].first;
if (c[x][y] - f[x][y] > 0 && dv[y] > dv[x] + G[x][i].second) {
dv[y] = dv[x] + G[x][i].second;
if (!o[y]) {
Q.push(y);
o[y] = 1;
}
}
}
}
}
bool dijkstra()
{
int i, z, x, y;
pair<int, int> p;
for (i = 0; i <= n; i++) d[i] = inf;
H.push(make_pair(0, s));
d[s] = 0;
dn[s] = 0;
while (!H.empty()) {
p = H.top();
H.pop();
x = p.second;
if (d[x] != p.first) continue;
z = G[x].size();
for (i = 0; i < z; i++) {
y = G[x][i].first;
D = d[x] + G[x][i].second + dv[x] - dv[y];
if (c[x][y] - f[x][y] > 0 && d[y] > D) {
d[y] = D;
dn[y] = dn[x] + G[x][i].second;
t[y] = x;
H.push(make_pair(D, y));
}
}
}
memcpy(dv,dn,sizeof(dn));
return !(d[e] == inf);
}
int main()
{
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out", "w", stdout);
citire();
bellmanford();
while (dijkstra()) {
r = inf;
a++;
for (i = e; i != s; i = t[i]) r = min(r, c[t[i]][i] - f[t[i]][i]);
cost += r * dn[e];
for (i = e; i != s; i = t[i]) {
f[t[i]][i] += r;
f[i][t[i]] -= r;
}
}
printf("%i", cost);
fclose(stdin);
fclose(stdout);
return 0;
}