```go
package main
import (
"bufio"
"container/heap"
"fmt"
"os"
)
type State struct {
d, r, c int
}
type PQ []*State
func (pq PQ) Len() int { return len(pq) }
func (pq PQ) Less(i, j int) bool { return pq[i].d < pq[j].d }
func (pq PQ) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] }
func (pq *PQ) Push(x interface{}) {
*pq = append(*pq, x.(*State))
}
func (pq *PQ) Pop() interface{} {
old := *pq
n := len(old)
item := old[n-1]
*pq = old[0 : n-1]
return item
}
func canonical(r, c, k int) (int, int) {
if r > k/2 {
return k - r, k - c
}
if r == k/2 && c > k/2 {
return k - r, k - c
}
return r, c
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func main() {
reader := bufio.NewReader(os.Stdin)
nextInt := func() int {
var n int
var c byte
var err error
for {
c, err = reader.ReadByte()
if err != nil {
return 0
}
if (c >= '0' && c <= '9') || c == '-' {
break
}
}
sign := 1
if c == '-' {
sign = -1
} else {
n = int(c - '0')
}
for {
c, err = reader.ReadByte()
if err != nil || c < '0' || c > '9' {
break
}
n = n*10 + int(c-'0')
}
return n * sign
}
t := nextInt()
for tc := 0; tc < t; tc++ {
n := nextInt()
k := nextInt()
costH := make([][]int, k+1)
for i := range costH {
costH[i] = make([]int, k)
}
costV := make([][]int, k)
for i := range costV {
costV[i] = make([]int, k+1)
}
for i := 0; i < n; i++ {
r1, c1, r2, c2 := nextInt(), nextInt(), nextInt(), nextInt()
if r1 == r2 {
c := min(c1, c2)
costV[r1-1][c]++
} else {
r := min(r1, r2)
costH[r][c1-1]++
}
}
dist := make([][]int, k/2+1)
for i := range dist {
dist[i] = make([]int, k+1)
for j := range dist[i] {
dist[i][j] = -1
}
}
pq := &PQ{}
heap.Init(pq)
startR, startC := k/2, k/2
dist[startR][startC] = 0
heap.Push(pq, &State{0, startR, startC})
minCut := -1
for pq.Len() > 0 {
curr := heap.Pop(pq).(*State)
d, r, c := curr.d, curr.r, curr.c
if dist[r][c] < d {
continue
}
if r == 0 || c == 0 || c == k {
minCut = d
break
}
if c < k {
w := costH[r][c] + costH[k-r][k-c-1]
canR, canC := canonical(r, c+1, k)
if dist[canR][canC] == -1 || dist[canR][canC] > d+w {
dist[canR][canC] = d + w
heap.Push(pq, &State{d + w, canR, canC})
}
}
if c > 0 {
w := costH[r][c-1] + costH[k-r][k-c]
canR, canC := canonical(r, c-1, k)
if dist[canR][canC] == -1 || dist[canR][canC] > d+w {
dist[canR][canC] = d + w
heap.Push(pq, &State{d + w, canR, canC})
}
}
if r < k {
w := costV[r][c] + costV[k-r-1][k-c]
canR, canC := canonical(r+1, c, k)
if dist[canR][canC] == -1 || dist[canR][canC] > d+w {
dist[canR][canC] = d + w
heap.Push(pq, &State{d + w, canR, canC})
}
}
if r > 0 {
w := costV[r-1][c] + costV[k-r][k-c]
canR, canC := canonical(r-1, c, k)
if dist[canR][canC] == -1 || dist[canR][canC] > d+w {
dist[canR][canC] = d + w
heap.Push(pq, &State{d + w, canR, canC})
}
}
}
fmt.Println(n - minCut)
}
}
```