```go
package main
import (
"bufio"
"fmt"
"os"
)
var in = bufio.NewReaderSize(os.Stdin, 1<<20)
var out = bufio.NewWriterSize(os.Stdout, 1<<20)
func ask(a, b, c int) int {
fmt.Fprintf(out, "? %d %d %d\n", a, b, c)
out.Flush()
var x int
if _, err := fmt.Fscan(in, &x); err != nil || x == -1 {
os.Exit(0)
}
return x
}
func answer(imps []int) {
fmt.Fprintf(out, "! %d", len(imps))
for _, v := range imps {
fmt.Fprintf(out, " %d", v)
}
fmt.Fprintln(out)
out.Flush()
}
func main() {
defer out.Flush()
var t int
if _, err := fmt.Fscan(in, &t); err != nil {
return
}
for ; t > 0; t-- {
var n int
if _, err := fmt.Fscan(in, &n); err != nil {
return
}
m := n / 3
typ := make([]int, m)
g0, g1 := -1, -1
for i := 0; i < m; i++ {
a := 3*i + 1
b := a + 1
c := a + 2
typ[i] = ask(a, b, c)
if typ[i] == 0 && g0 == -1 {
g0 = i
}
if typ[i] == 1 && g1 == -1 {
g1 = i
}
}
a1, a2, a3 := 3*g0+1, 3*g0+2, 3*g0+3
b1, b2, b3 := 3*g1+1, 3*g1+2, 3*g1+3
x1 := ask(a1, a2, b1)
x2 := ask(a1, a2, b2)
x3 := ask(a1, a2, b3)
imp, crew := 0, 0
if x1 == 1 {
imp, crew = a3, b1
} else if x2 == 1 {
imp, crew = a3, b2
} else if x3 == 1 {
imp, crew = a3, b3
} else {
imp = a1
y := ask(a1, b1, b2)
if y == 1 {
crew = b1
} else {
z := ask(a1, b1, b3)
if z == 1 {
crew = b1
} else {
crew = b2
}
}
}
isImp := make([]bool, n+1)
for i := 0; i < m; i++ {
x := 3*i + 1
y := x + 1
z := x + 2
if typ[i] == 0 {
p := ask(x, y, crew)
q := ask(x, z, crew)
if p == 0 {
isImp[x] = true
isImp[y] = true
isImp[z] = q == 0
} else {
isImp[z] = true
if q == 0 {
isImp[x] = true
isImp[y] = false
} else {
isImp[x] = false
isImp[y] = true
}
}
} else {
p := ask(x, y, imp)
q := ask(x, z, imp)
if p == 1 {
isImp[x] = false
isImp[y] = false
isImp[z] = q == 0
} else {
isImp[z] = false
if q == 1 {
isImp[x] = false
isImp[y] = true
} else {
isImp[x] = true
isImp[y] = false
}
}
}
}
res := make([]int, 0)
for i := 1; i <= n; i++ {
if isImp[i] {
res = append(res, i)
}
}
answer(res)
}
}
```