#include using namespace std; struct bigint { vector d; bigint(int x) { while (x) { d.emplace_back(x % 10); x /= 10; } } bool operator < (bigint n) const { if (n.d.size() != d.size()) return d.size() < n.d.size(); int i = int(d.size()) - 1; while (i >= 0) { if (n.d[i] != d[i]) return d[i] < n.d[i]; i--; } return false; } bool operator <= (bigint n) const { if (n.d.size() != d.size()) return d.size() < n.d.size(); int i = int(d.size()) - 1; while (i >= 0) { if (n.d[i] != d[i]) return d[i] < n.d[i]; i--; } return true; } bool operator > (bigint n) const { if (n.d.size() != d.size()) return d.size() > n.d.size(); int i = int(d.size()) - 1; while (i >= 0) { if (n.d[i] != d[i]) return d[i] > n.d[i]; i--; } return false; } bool operator >= (bigint n) const { if (n.d.size() != d.size()) return d.size() > n.d.size(); int i = int(d.size()) - 1; while (i >= 0) { if (n.d[i] != d[i]) return d[i] > n.d[i]; i--; } return true; } bool operator == (bigint n) const { return d == n.d; } bool operator != (bigint n) const { return d != n.d; } bigint operator + (bigint n) const { if (n.d.size() < d.size()) n.d.resize(d.size()); for (int i = 0; i < d.size(); i++) n.d[i] += d[i]; for (int i = 0; i < n.d.size(); i++) if (n.d[i] >= 10) { if (i + 1 == n.d.size()) n.d.emplace_back(0); n.d[i + 1] ++; n.d[i] -= 10; } return n; } bigint operator - (bigint n) const { bigint res = *this; assert(n <= res); for (int i = 0; i < n.d.size(); i++) res.d[i] -= n.d[i]; for (int i = 0; i < res.d.size(); i++) if (res.d[i] < 0) { res.d[i + 1] --; res.d[i] += 10; } while((!res.d.empty()) && res.d.back() == 0) res.d.erase(res.d.end() - 1); return res; } bigint operator * (bigint n) const { bigint res(0); if (d.empty() || n.d.empty()) return res; res.d.resize(d.size() + n.d.size() - 1); for (int i = 0; i < d.size(); i++) { for (int j = 0; j < n.d.size(); j++) { res.d[i + j] += d[i] * n.d[j]; } } for (int i = 0; i < res.d.size(); i++) if(res.d[i] >= 10) { if (i + 1 == res.d.size()) res.d.emplace_back(0); res.d[i + 1] += res.d[i] / 10; res.d[i] %= 10; } return res; } bigint operator % (bigint n) const { assert(!n.d.empty()); bigint r(0); for (int i = d.size() - 1; i >= 0; i--) { r = bigint(10) * r + d[i]; int L = 0, R = 10; while (R - L > 1) { int M = (L + R) / 2; if (bigint(M) * n <= r) L = M; else R = M; } r = r - bigint(L) * n; } return r; } bigint operator / (bigint n) const { assert(!n.d.empty()); bigint q = 0, r = 0; for (int i = d.size() - 1; i >= 0; i--) { r = bigint(10) * r + d[i]; q = bigint(10) * q; int L = 0, R = 10; while (R - L > 1) { int M = (L + R) / 2; if (bigint(M) * n <= r) L = M; else R = M; } q = q + L; r = r - bigint(L) * n; } return q; } }; bigint mygcd(bigint a, bigint b) { while (!a.d.empty()) { swap(a, b); a = a % b; } return b; } struct rational { bigint a, b; rational(bigint _a, bigint _b) : a(_a / mygcd(_a, _b)), b(_b / mygcd(_a, _b)) {} bool operator < (rational r) const { return a * r.b < b * r.a; } bool operator <= (rational r) const { return a * r.b <= b * r.a; } bool operator > (rational r) const { return a * r.b > b * r.a; } bool operator >= (rational r) const { return a * r.b >= b * r.a; } bool operator == (rational r) const { return a * r.b == b * r.a; } bool operator != (rational r) const { return a * r.b != b * r.a; } rational operator + (rational r) const { bigint na = a * r.b + b * r.a; bigint nb = b * r.b; return rational(na, nb); } }; template using min_priority_queue = priority_queue, greater>; int main() { int N, M; cin >> N >> M; vector>> E(N); while (M--) { int u, v, a, b; cin >> u >> v >> a >> b; u--; v--; E[u].emplace_back(v, rational(a, b)); E[v].emplace_back(u, rational(a, b)); } vector D(N, rational(300 * N, 1)); D[0] = rational(0, 1); min_priority_queue> Q; Q.emplace(D[0], 0); while (!Q.empty()) { auto[d, v] = Q.top(); Q.pop(); if (d != D[v]) continue; for (auto[u, w] : E[v]) { if (d + w < D[u]) { D[u] = d + w; Q.emplace(D[u], u); } } } for (int i = 1; i < N; i++) { auto a = D[i].a.d, b = D[i].b.d; for (int i = a.size() - 1; i >= 0; i--) cout << a[i]; cout << " "; for (int i = b.size() - 1; i >= 0; i--) cout << b[i]; cout << endl; } }