#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int inf = 1e12;
struct edge
{
int u, w, f, id;
};
vector<edge> g[200010];
struct EK
{
int s, t;
int MinCost, MaxFlow, len;
int dist[5005], h[5005], f[5005];
int pre[5005], e[5005];
void add(int x, int y, int z, int val)
{
int idx = (int)g[x].size(), idy = (int)g[y].size();
g[x].push_back({y, z, val, idy});
g[y].push_back({x, 0, -val, idx});
}
bool dijkstra()
{
for (int i = 0; i < 5005; i ++)
{
f[i] = 0;
dist[i] = inf;
}
priority_queue<pair<int, int>> que;
que.push({0, s});
dist[s] = 0;
while (!que.empty())
{
int x = que.top().second;
que.pop();
if (f[x])
continue;
f[x] = 1;
for (int i = (int)g[x].size() - 1; ~i; -- i)
{
int y = g[x][i].u, z = g[x][i].w, val = g[x][i].f;
if (z && dist[y] > dist[x] + val + h[x] - h[y])
{
dist[y] = dist[x] + val + h[x] - h[y];
pre[y] = x;
e[y] = i;
if (f[y] == 0)
que.push({-dist[y], y});
}
}
}
for (int i = 0; i <= len; i ++)
if (dist[i] < inf)
h[i] += dist[i];
memset(f, 0, sizeof f);
return dist[t] < inf;
}
int dfs(int x, int sum)
{
if (x == t || sum == 0)
return sum;
int sz = g[x].size(), res = 0;
f[x] = 1;
for (int i = 0; i < sz && sum != res; i ++)
{
int y = g[x][i].u, z = g[x][i].w, val = g[x][i].f, id = g[x][i].id;
if (z == 0 || f[y] || h[x] + val != h[y])
continue;
int now = dfs(y, min(sum - res, z));
g[x][i].w -= now;
g[y][id].w += now;
res += now;
MinCost += now * val;
}
f[x] = 0;
return res;
}
void dinic()
{
int now = 0;
while (dijkstra())
if (now = dfs(s, inf))
MaxFlow += now;
}
void ek()
{
int res = 0;
while (dijkstra())
{
int Min = inf;
for (int y = t, x = pre[t]; y != s; y = pre[y], x = pre[y])
Min = min(Min, g[x][e[y]].w);
for (int y = t, x = pre[t]; y != s; y = pre[y], x = pre[y])
g[x][e[y]].w -= Min, g[y][g[x][e[y]].id].w += Min;
MinCost += h[t] * Min;
MaxFlow += Min;
}
}
};
signed main()
{
int n, m; scanf("%lld %lld", &n, &m);
EK T;
T.s = 1;
T.t = n;
T.len = n;
for (int i = 0; i < m; i ++)
{
int x, y, z, val; scanf("%lld %lld %lld %lld", &x, &y, &z, &val);
T.add(x, y, z, val);
}
T.dinic();
printf("%lld %lld\n", T.MaxFlow, T.MinCost);
return 0;
}