package main
import (
"os"
)
const MOD = 998244353
func powExp(base, exp int64) int64 {
res := int64(1)
base %= MOD
for exp > 0 {
if exp%2 == 1 {
res = (res * base) % MOD
}
base = (base * base) % MOD
exp /= 2
}
return res
}
func modInverse(n int64) int64 {
return powExp(n, MOD-2)
}
func main() {
buf := make([]byte, 65536)
var pos, length int
readByte := func() byte {
if pos >= length {
n, err := os.Stdin.Read(buf)
if n == 0 || err != nil {
return 0
}
pos = 0
length = n
}
b := buf[pos]
pos++
return b
}
readInt := func() int64 {
var res int64
b := readByte()
for b <= ' ' {
if b == 0 {
return 0
}
b = readByte()
}
for b > ' ' {
res = res*10 + int64(b-'0')
b = readByte()
}
return res
}
n := int(readInt())
if n == 0 {
return
}
m := int(readInt())
head := make([]int, m+1)
for i := 0; i <= m; i++ {
head[i] = -1
}
next := make([]int, n)
l_arr := make([]int, n)
w_arr := make([]int64, n)
C := int64(1)
for i := 0; i < n; i++ {
l := int(readInt())
r := int(readInt())
p := readInt()
q := readInt()
pMod := p % MOD
qMinusP := (q - p) % MOD
if qMinusP < 0 {
qMinusP += MOD
}
invQMinusP := modInverse(qMinusP)
w := (pMod * invQMinusP) % MOD
l_arr[i] = l
w_arr[i] = w
next[i] = head[r]
head[r] = i
term := (qMinusP * modInverse(q)) % MOD
C = (C * term) % MOD
}
dp := make([]int64, m+1)
dp[0] = 1
for x := 1; x <= m; x++ {
for i := head[x]; i != -1; i = next[i] {
l := l_arr[i]
w := w_arr[i]
dp[x] = (dp[x] + dp[l-1]*w) % MOD
}
}
ans := (dp[m] * C) % MOD
var printInt func(int64)
printInt = func(val int64) {
if val == 0 {
os.Stdout.Write([]byte{'0', '\n'})
return
}
var out []byte
for val > 0 {
out = append(out, byte(val%10)+'0')
val /= 10
}
for i, j := 0, len(out)-1; i < j; i, j = i+1, j-1 {
out[i], out[j] = out[j], out[i]
}
out = append(out, '\n')
os.Stdout.Write(out)
}
printInt(ans)
}