#include<atcoder/modint>#include<bits/stdc++.h>usingnamespacestd;usingnamespaceatcoder;usingmint=modint998244353;classTree{public:intn;vector<vector<int>>adj;vector<vector<vector<mint>>>dp;vector<vector<mint>>sum;// dp[i][d] is the number of colorings of the i-th subtree when the
// maximum black nodes on the upward path to i is d.
Tree(intn){this->n=n;adj.resize(n);dp.resize(n,vector<vector<mint>>(3,vector<mint>(2,0)));sum.resize(n,vector<mint>(3,0));}voiddfs(intsrc,intpar){// Start with no children.
dp[src][0][0]=1;dp[src][1][1]=1;for(autochild:adj[src]){if(child==par){continue;}dfs(child,src);vector<vector<mint>>ndp(3,vector<mint>(2,0));for(intrc=0;rc<=1;rc++){for(intd=0;d<3;d++){for(intnow=0;now<3;now++){if(d+now>=3){continue;}intnxt=max(now+rc,d);if(nxt<3){// Append this children.
ndp[nxt][rc]+=dp[src][d][rc]*sum[child][now];}}}}swap(dp[src],ndp);}for(intd=0;d<3;d++){for(intrc=0;rc<=1;rc++){sum[src][d]+=dp[src][d][rc];}}}};voidsolve(){intn;cin>>n;Treet(n);intm=n-1;for(inti=0;i<m;i++){intx,y;cin>>x>>y;x--;y--;t.adj[x].push_back(y);t.adj[y].push_back(x);}t.dfs(0,-1);mintans=0;auto&sum=t.sum;for(intd=0;d<3;d++){ans+=sum[0][d];}cout<<ans.val()<<"\n";}intmain(){ios_base::sync_with_stdio(false);cin.tie(NULL);intt;cin>>t;for(inti=0;i<t;i++){solve();}return0;}