#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 10;
const int inf = (-1u) >> 1;
struct node {
  int l, h, a;
  node() {}
  node(int _l, int _h, int _a) : l(_l), h(_h), a(_a) {}
};
node g[8][8];
int n, in[8], out[8], minf, maxe;
void init() {
  for (int i = 0; i < (n * (n - 1) / 2); ++i) {
    int a, b, l, h, c;
    scanf("%d%d%d%d%d", &a, &b, &l, &h, &c);
    g[--a][--b] = node(l, h, c);
  }
}
void update(int f, int e) {
  if (f < minf) {
    minf = f, maxe = e;
  } else if (f == minf) {
    maxe = max(maxe, e);
  }
}
void dfs(int s, int t, int cure) {
  if (s == n - 1) {
    update(out[0], cure);
    return;
  }
  if (t == n) {
    if (s && in[s] != out[s]) {
      return;
    }
    dfs(s + 1, s + 2, cure);
    return;
  }
  for (int i = (g[s][t].l); i <= (g[s][t].h); ++i) {
    if (!s && out[s] + i > minf) {
      return;
    }
    if (s && out[s] + i > in[s]) {
      return;
    }
    out[s] += i, in[t] += i;
    int nowe = cure + i * i;
    if (i) nowe += g[s][t].a;
    dfs(s, t + 1, nowe);
    out[s] -= i, in[t] -= i;
  }
}
void solve() {
  minf = inf;
  maxe = 0;
  for (int i = 0; i < (n); ++i) {
    in[i] = out[i] = 0;
  }
  dfs(0, 1, 0);
  if (minf == inf) {
    puts("-1 -1");
  } else {
    printf("%d %d\n", minf, maxe);
  }
}
int main() {
  while (scanf("%d", &n) != EOF) {
    init();
    solve();
  }
  return 0;
}
