package main
import (
"bytes"
"io"
"os"
"strconv"
)
type FastScanner struct {
data []byte
idx int
n int
}
func NewFastScanner() *FastScanner {
data, _ := io.ReadAll(os.Stdin)
return &FastScanner{data: data, n: len(data)}
}
func (fs *FastScanner) NextInt() int {
for fs.idx < fs.n && (fs.data[fs.idx] < '0' || fs.data[fs.idx] > '9') {
fs.idx++
}
val := 0
for fs.idx < fs.n && fs.data[fs.idx] >= '0' && fs.data[fs.idx] <= '9' {
val = val*10 + int(fs.data[fs.idx]-'0')
fs.idx++
}
return val
}
func main() {
in := NewFastScanner()
t := in.NextInt()
var out bytes.Buffer
for ; t > 0; t-- {
n := in.NextInt()
m := 2 * (n - 1)
head := make([]int, n+1)
for i := 1; i <= n; i++ {
head[i] = -1
}
to := make([]int, m)
next := make([]int, m)
idx := 0
addEdge := func(u, v int) {
to[idx] = v
next[idx] = head[u]
head[u] = idx
idx++
}
for i := 0; i < n-1; i++ {
u := in.NextInt()
v := in.NextInt()
addEdge(u, v)
addEdge(v, u)
}
parent := make([]int, n+1)
order := make([]int, 0, n)
stack := make([]int, 0, n)
stack = append(stack, 1)
for len(stack) > 0 {
u := stack[len(stack)-1]
stack = stack[:len(stack)-1]
order = append(order, u)
for e := head[u]; e != -1; e = next[e] {
v := to[e]
if v == parent[u] {
continue
}
parent[v] = u
stack = append(stack, v)
}
}
sz := make([]int, n+1)
dp := make([]int, n+1)
for i := len(order) - 1; i >= 0; i-- {
u := order[i]
sz[u] = 1
c1, c2 := 0, 0
for e := head[u]; e != -1; e = next[e] {
v := to[e]
if v == parent[u] {
continue
}
sz[u] += sz[v]
if c1 == 0 {
c1 = v
} else {
c2 = v
}
}
if c1 == 0 {
dp[u] = 0
} else if c2 == 0 {
dp[u] = sz[c1] - 1
} else {
a := dp[c1] + sz[c2] - 1
b := dp[c2] + sz[c1] - 1
if a > b {
dp[u] = a
} else {
dp[u] = b
}
}
}
out.WriteString(strconv.Itoa(dp[1]))
out.WriteByte('\n')
}
os.Stdout.Write(out.Bytes())
}