package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
)
type Item struct {
run int32
val int32
sci int32
pos int32
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
var getInt64 = func() int64 {
scanner.Scan()
res, _ := strconv.ParseInt(scanner.Text(), 10, 64)
return res
}
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
var items []Item
saveItems := true
maxRuns := 0
var totalK int64 = 0
for i := 1; i <= n; i++ {
k := getInt64()
a1 := getInt64()
x := getInt64()
y := getInt64()
m := getInt64()
totalK += k
if totalK > 200000 {
saveItems = false
items = nil
}
run_idx := int32(0)
prev := a1
if saveItems {
items = append(items, Item{run: run_idx, val: int32(prev), sci: int32(i), pos: 1})
}
for j := int64(2); j <= k; j++ {
curr := (prev*x + y) % m
if curr < prev {
run_idx++
}
if saveItems {
items = append(items, Item{run: run_idx, val: int32(curr), sci: int32(i), pos: int32(j)})
}
prev = curr
}
if int(run_idx+1) > maxRuns {
maxRuns = int(run_idx + 1)
}
}
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
fmt.Fprintln(out, maxRuns-1)
if saveItems && totalK <= 200000 {
sort.Slice(items, func(i, j int) bool {
if items[i].run != items[j].run {
return items[i].run < items[j].run
}
if items[i].val != items[j].val {
return items[i].val < items[j].val
}
if items[i].sci != items[j].sci {
return items[i].sci < items[j].sci
}
return items[i].pos < items[j].pos
})
for _, item := range items {
fmt.Fprintln(out, item.val, item.sci)
}
}
}