#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const ll oo = 2e18;
const int N = 2e5+5;
const int M = 3e5+5;

struct Edge {
    int u, v; ll p, w;
    bool operator<(const Edge& b) const {
        return p < b.p;
    }
} edges[M];

struct Node {
    int to; ll w;
};

int n, m;
ll D[N];
vector<Node> adj[N];

int p[N], sz[N];
int find(int u) {
    return (p[u] == u) ? u : (p[u] = find(p[u]));
}

void unite(int u, int v) {
    u = find(u), v = find(v);
    if (u == v) return;
    if (sz[u] < sz[v]) swap(u, v);
    p[v] = u;
    sz[u] += sz[v];
}

void solve() {
    cin >> n >> m;
    for (int i = 0; i < m; i++)
        cin >> edges[i].u >> edges[i].v >> edges[i].p >> edges[i].w;
    sort(edges, edges + m);

    for (int i = 1; i <= n; i++) {
        p[i] = i;
        sz[i] = 1;
    }

    ll P = -1;
    for (int i = 0; i < m; i++)  {
        unite(edges[i].u, edges[i].v);
        if (find(1) == find(n)) {
            P = edges[i].p;
            break;
        }
    }

    for (int i = 0; i < m; i++)
        if (edges[i].p <= P) {
            adj[edges[i].u].push_back({edges[i].v, edges[i].w});
            adj[edges[i].v].push_back({edges[i].u, edges[i].w});
        } else break;

    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;
    for (int i = 1; i <= n; i++) D[i] = oo;

    D[1] = 0;
    pq.push({0, 1});

    while (!pq.empty()) {
        pair<ll, int> t = pq.top(); pq.pop();
        ll d = t.first; int u = t.second;
        if (d > D[u]) continue;
        if (u == n) break;
        for (Node& e : adj[u]) {
            int v = e.to; ll nd = d + e.w;
            if (D[v] > nd) {
                D[v] = nd;
                pq.push({D[v], v});
            }
        }
    }
    cout << P << " " << D[n] << "\n";
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);

    #define TASK "SOTAN"
    if (fopen(TASK".INP", "r")) {
        freopen(TASK".INP", "r", stdin);
        freopen(TASK".OUT", "w", stdout);
    }

    int tests = 1; // cin >> tests;
    while (tests--) solve();

    #ifndef ONLINE_JUDGE
    cerr << "\nTime elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
    #endif

    return 0;
}