#include<bits/stdc++.h>
#define MAXN 500005
#define mod 998244353
#define P pair<int,int>
#define int long long
using namespace std;
vector<int>G[1000005];
int vis[MAXN],p[MAXN],dep[MAXN];
int g[MAXN],f[MAXN];
map<P,int>ma;
int n,m,T;
int flg;
int book(int x,int y){
return ma[P(x,y)]||ma[P(y,x)];
}
void findcut(int x,int y){
if(book(x,y)){
flg=1;
return ;
}
ma[P(x,y)]=1;
while(x!=y){
if(dep[x]<=dep[y])swap(x,y);
if(book(x,p[x])){
flg=1;
return ;
}
ma[P(x,p[x])]=1;
x=p[x];
}
}
void dfs(int x,int pre){
p[x]=pre;dep[x]=dep[pre]+1;
int l=G[x].size();
for(int i=0;l>i;i++){
if(flg==1)return ;
int y=G[x][i];
if(y==pre)continue;
if(book(x,y))continue;
if(vis[y]){
findcut(x,y);
continue;
}else{
vis[y]=1;
dfs(y,x);
}
}
}
void dfs2(int x,int pre){
vis[x]=1;
int l=G[x].size();
int tt=0;
f[x]=1;
for(int i=0;l>i;i++){
int y=G[x][i];
if(book(x,y)||y==pre)continue;
dfs2(y,x);
f[x]=(f[x]*f[y])%mod;
tt++;
}
f[x]=(f[x]*g[tt-(pre==0)+1])%mod;
}
void init(){
flg=0;
ma.clear();
memset(vis,0,sizeof(vis));
for(int i=1;n>=i;i++)G[i].clear();
cin>>n>>m;
int x,y;
for(int i=0;m>i;i++){
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
}
void solve(){
init();
if(m>2*n-2){
cout<<0<<endl;
return ;
}
vis[1]=1;
dfs(1,0);
if(flg==1){
cout<<0<<endl;
return ;
}
memset(vis,0,sizeof(vis));
int ans=1;
for(int i=1;n>=i;i++){
if(!vis[i]){
dfs2(i,0);
ans=(ans*f[i])%mod;
}
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);
g[0]=g[1]=1;
for(int i=2;MAXN-4>=i;i++)g[i]=(g[i-1]+(i-1)*g[i-2]%mod)%mod;
cin>>T;
while(T--){
solve();
}
return 0;
}