```go
package main
import (
"bufio"
"fmt"
"os"
)
var (
in = bufio.NewScanner(os.Stdin)
out = bufio.NewWriter(os.Stdout)
)
func init() {
in.Split(bufio.ScanWords)
}
func readInt() int {
in.Scan()
s := in.Bytes()
val := 0
for _, b := range s {
val = val*10 + int(b-'0')
}
return val
}
func main() {
defer out.Flush()
if !in.Scan() {
return
}
tStr := in.Bytes()
t := 0
for _, b := range tStr {
t = t*10 + int(b-'0')
}
for i := 0; i < t; i++ {
n := readInt()
m := readInt()
ls := make([]int, n)
rs := make([]int, n)
var sumA, sumB int64
var sMin, sMax int64
for j := 0; j < n; j++ {
a := readInt()
b := readInt()
sumA += int64(a)
sumB += int64(b)
l := 0
if val := m - b; val > 0 {
l = val
}
r := m
if a < m {
r = a
}
ls[j] = l
rs[j] = r
sMin += int64(l)
sMax += int64(r)
}
D := sumA - sumB + int64(n)*int64(m)
var bestX int64
if D <= 2*sMin {
bestX = sMin
} else if D >= 2*sMax {
bestX = sMax
} else {
bestX = D / 2
}
diff := D - 2*bestX
if diff < 0 {
diff = -diff
}
fmt.Fprintln(out, diff)
rem := bestX - sMin
for j := 0; j < n; j++ {
canAdd := int64(rs[j] - ls[j])
add := canAdd
if rem < canAdd {
add = rem
}
valX := int64(ls[j]) + add
valY := int64(m) - valX
rem -= add
fmt.Fprint(out, valX, " ", valY, "\n")
}
}
}
```