#include <bits/stdc++.h>
using namespace std;
class mcmf {
const int inf = 1e9;
vector <vector <int>> e, g, c;
int s, t;
vector <int> d, from;
vector <bool> inq;
public:
mcmf(int n, int s, int t) : e(n + 1, vector <int>(n + 1, 0)), g(n + 1), c(e), s(s), t(t), d(n + 1), from(n + 1), inq(n + 1, false) {}
void add_edge(int u, int v, int w, int co) {
g[u].push_back(v); g[v].push_back(u);
e[u][v] = w;
c[u][v] = co;
e[v][u] = 0;
c[v][u] = -co;
}
pair <int, int> bellman_ford() {
queue <int> q;
q.push(s);
d[s] = 0; from[s] = s;
while(!q.empty()) {
int u = q.front();
q.pop();
inq[u] = false;
for(int v : g[u]) {
if(e[u][v] && d[u] + c[u][v] < d[v]) {
d[v] = d[u] + c[u][v];
from[v] = u;
if(!inq[v]) {
q.push(v);
inq[v] = true;
}
}
}
}
if(d[t] != inf) {
int flow = inf;
for(int i = t; i != s; i = from[i]) flow = min(flow, e[from[i]][i]);
for(int i = t; i != s; i = from[i]) {
e[from[i]][i] -= flow;
e[i][from[i]] += flow;
}
return {flow, d[t] * flow};
}
return {0, 0};
}
pair <int, int> flow() {
int flow = 0, cost = 0;
fill(d.begin(), d.end(), inf);
pair <int, int> fc = bellman_ford();
while(fc.first != 0) {
flow += fc.first;
cost += fc.second;
fill(d.begin(), d.end(), inf);
fc = bellman_ford();
}
return {flow, cost};
}
};
int main()
{
ifstream cin("fmcm.in");
ofstream cout("fmcm.out");
int n, m, s, t;
cin >> n >> m >> s >> t;
mcmf F(n, s, t);
for(int i = 0, u, v, w, c; i < m; i++) {
cin >> u >> v >> w >> c;
F.add_edge(u, v, w, c);
}
auto f = F.flow();
cout << f.second << "\n";
return 0;
}