← Home
```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")
		}
	}
}
```