#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = getchar();
  }
  if (flag) x = -x;
}
int n, m, s, t, sum;
int in[10010], dis[10010];
bool vis[10010];
struct edge {
  int to, nxt, v, c;
  edge(int x = 0, int y = 0, int z = 0, int w = 0) {
    to = x, nxt = y, v = z, c = w;
  }
} e[10010];
int head[10010], edge_cnt = 1;
void add(int from, int to, int l, int r, int cost) {
  in[from] -= l, in[to] += l;
  e[++edge_cnt] = edge(to, head[from], r - l, cost), head[from] = edge_cnt;
  e[++edge_cnt] = edge(from, head[to], 0, -cost), head[to] = edge_cnt;
}
bool spfa() {
  for (int i = s; i <= t; ++i) vis[i] = false, dis[i] = 1000000000;
  queue<int> q;
  q.push(s), vis[s] = true, dis[s] = 0;
  while (!q.empty()) {
    int x = q.front();
    q.pop(), vis[x] = false;
    for (int i = head[x]; i; i = e[i].nxt) {
      int y = e[i].to, c = e[i].c;
      if (dis[y] <= dis[x] + c || !e[i].v) continue;
      dis[y] = dis[x] + c;
      if (!vis[y]) q.push(y), vis[y] = true;
    }
  }
  return dis[t] != 1000000000;
}
int dfs(int x, int lim) {
  if (x == t) return lim;
  vis[x] = true;
  int res = lim, flow;
  for (int i = head[x]; i; i = e[i].nxt) {
    int y = e[i].to, v = e[i].v;
    if (dis[y] != dis[x] + e[i].c || vis[y] || !v) continue;
    if (flow = dfs(y, min(res, v))) {
      res -= flow, e[i].v -= flow, e[i ^ 1].v += flow;
      if (!res) break;
    }
  }
  return lim - res;
}
int dinic() {
  int flow, v = 0;
  while (spfa())
    while (flow = dfs(s, 1000000000)) v += flow * dis[t];
  return v;
}
int main() {
  read(n), read(m), t = n + 1, add(n, 1, 0, 1000000000, 0);
  for (int i = 1; i <= m; ++i) {
    int x, y, a, b;
    read(x), read(y), read(a), read(b), add(x, y, b, b, 0);
    if (a >= b)
      add(y, x, 0, b, 1), add(x, y, 0, a - b, 1);
    else
      sum += b - a, add(y, x, 0, a, 1), add(y, x, 0, b - a, 0);
    add(x, y, 0, 1000000000, 2);
  }
  for (int i = 1; i <= n; i++) {
    if (in[i] > 0)
      add(s, i, 0, in[i], 0);
    else
      add(i, t, 0, -in[i], 0);
  }
  printf("%d", sum + dinic());
  return 0;
}
