#include using namespace std; #define all(x) (x).begin(), (x).end() #define sz(x) static_cast((x).size()) #define FOR(i, x) for (int i = 0; i < (x).size(); ++i) template T max() { return numeric_limits::max(); } template T min() { return numeric_limits::min(); } #ifdef LOCAL #define dbg(x) cerr << #x << " = " << (x) << '\n' #else #define dbg(x) #endif void solve() { int n; cin >> n; unordered_map> graph; while (--n) { int u, v; cin >> u >> v; graph[u].push_back(v); graph[v].push_back(u); } auto ans = min(); auto is_leaf = [&graph](int u) { return (u != 1 && graph[u].size() == 1) || (u == 1) && graph[u].empty(); }; auto dfs = [&](auto &dfs, int u, int parent) -> int { if (u == parent || is_leaf(u)) { return 0; } int first = 0, second = 0; for (auto v : graph[u]) { if (v == parent) continue; auto through = dfs(dfs, v, u); if (through > first) { second = through; swap(first, second); } else if (through > second) { second = through; } } int remove_u_and_one_child = sz(graph[u]) - (u != 1) - (first != 0) + first; int remove_through_u = sz(graph[u]) - (u != 1) - (first != 0) - (second != 0) + first + second; int no_remove_u = 1 + first; ans = max(ans, max(remove_through_u, no_remove_u)); return remove_u_and_one_child; }; std::cout << max(ans, dfs(dfs, 1, -1)) << '\n'; } int main() { cin.tie(nullptr)->sync_with_stdio(false); int t; cin >> t; while (t--) { solve(); } return 0; }