#include <iostream>
#include <vector>
using namespace std;
#define ll long long
const ll MOD = 998244353;
ll binpow(ll x, ll y) {
if (y == 0) return 1;
ll res = binpow(x, y / 2);
res = res * res % MOD;
if (y & 1) res = res * x % MOD;
return res;
}
ll inv(ll x) {
return binpow(x, MOD - 2);
}
int main() {
cin.tie(0)->sync_with_stdio(0);
int n, m; cin >> n >> m;
vector<vector<pair<int, ll>>> arr(m + 1); // arr[right endpt] = {length of segment, p * inv(q) % MOD}
vector<ll> psum(m + 1, 1);
for (int i = 0; i < n; i++) {
int l, r; ll p, q;
cin >> l >> r >> p >> q;
ll mul = p * inv(q) % MOD;
arr[r].push_back({r - l + 1, mul});
psum[l] = psum[l] * (1 - mul + MOD) % MOD; // (1 - p/q)
}
for (int i = 1; i <= m; i++) {
psum[i] = psum[i - 1] * psum[i] % MOD;
}
vector<ll> dp(m + 1, 0);
dp[0] = 1;
for (int i = 1; i <= m; i++) {
for (auto [len, mul] : arr[i]) {
int j = i - len;
// dp[j] * (psum[i] / psum[j]) / (1 - mul) * mul
dp[i] = (dp[i] + dp[j] * psum[i] % MOD * inv(psum[j]) % MOD * inv((1 - mul + MOD) % MOD) % MOD * mul % MOD) % MOD;
}
}
cout << dp[m] << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBsbCBsb25nIGxvbmcKCmNvbnN0IGxsIE1PRCA9IDk5ODI0NDM1MzsKCmxsIGJpbnBvdyhsbCB4LCBsbCB5KSB7CglpZiAoeSA9PSAwKSByZXR1cm4gMTsKCWxsIHJlcyA9IGJpbnBvdyh4LCB5IC8gMik7CglyZXMgPSByZXMgKiByZXMgJSBNT0Q7CglpZiAoeSAmIDEpIHJlcyA9IHJlcyAqIHggJSBNT0Q7CglyZXR1cm4gcmVzOwp9CgpsbCBpbnYobGwgeCkgewoJcmV0dXJuIGJpbnBvdyh4LCBNT0QgLSAyKTsKfQoKaW50IG1haW4oKSB7CgljaW4udGllKDApLT5zeW5jX3dpdGhfc3RkaW8oMCk7CglpbnQgbiwgbTsgY2luID4+IG4gPj4gbTsKCXZlY3Rvcjx2ZWN0b3I8cGFpcjxpbnQsIGxsPj4+IGFycihtICsgMSk7IC8vIGFycltyaWdodCBlbmRwdF0gPSB7bGVuZ3RoIG9mIHNlZ21lbnQsIHAgKiBpbnYocSkgJSBNT0R9CgoJdmVjdG9yPGxsPiBwc3VtKG0gKyAxLCAxKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJaW50IGwsIHI7IGxsIHAsIHE7CgkJY2luID4+IGwgPj4gciA+PiBwID4+IHE7CgoJCWxsIG11bCA9IHAgKiBpbnYocSkgJSBNT0Q7CgkJYXJyW3JdLnB1c2hfYmFjayh7ciAtIGwgKyAxLCBtdWx9KTsKCQlwc3VtW2xdID0gcHN1bVtsXSAqICgxIC0gbXVsICsgTU9EKSAlIE1PRDsgLy8gKDEgLSBwL3EpCgl9CgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbTsgaSsrKSB7CgkJcHN1bVtpXSA9IHBzdW1baSAtIDFdICogcHN1bVtpXSAlIE1PRDsKCX0KCgl2ZWN0b3I8bGw+IGRwKG0gKyAxLCAwKTsKCWRwWzBdID0gMTsKCWZvciAoaW50IGkgPSAxOyBpIDw9IG07IGkrKykgewoJCWZvciAoYXV0byBbbGVuLCBtdWxdIDogYXJyW2ldKSB7CgkJCWludCBqID0gaSAtIGxlbjsgCgoJCQkvLyBkcFtqXSAqIChwc3VtW2ldIC8gcHN1bVtqXSkgLyAoMSAtIG11bCkgKiBtdWwKCQkJZHBbaV0gPSAoZHBbaV0gKyBkcFtqXSAqIHBzdW1baV0gJSBNT0QgKiBpbnYocHN1bVtqXSkgJSBNT0QgKiBpbnYoKDEgLSBtdWwgKyBNT0QpICUgTU9EKSAlIE1PRCAqIG11bCAlIE1PRCkgJSBNT0Q7CgkJfQoJfQoJY291dCA8PCBkcFttXSA8PCAnXG4nOwoJcmV0dXJuIDA7Cn0K