50分WA……
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int mo=998244353;
struct node{int en,next;} e[2000001];
int T,n,m,x,y,tot=1,top,stk[500001],f[500001],g[500001],stke[500001],last[2000001];
bool bz[2000001],bz2[500001];
void add(int x,int y)
{
e[++tot].en=y;
e[tot].next=last[x];
last[x]=tot;
}
bool pd(int x,int fa)
{
stk[x]=top;bz2[x]=true;
for (int i=last[x];i;i=e[i].next)
if (e[i].en!=fa&&!bz[i])
{
if (bz2[e[i].en])
{
bz[i]=bz[i^1]=true;
for (int j=stk[e[i].en]+1;j<=stk[x];j++)
{
if (bz[stke[j]]) return false;
bz[stke[j]]=bz[stke[j]^1]=true;
}
continue;
}
stke[++top]=i;
if (!pd(e[i].en,x)) return false;
}
--top;
return true;
}
void dg(int x,int fa)
{
f[x]=1;bz2[x]=true;
int sum=0;
for (int i=last[x];i;i=e[i].next)
if (e[i].en!=fa&&!bz[i])
{
dg(e[i].en,x);
f[x]=f[x]*f[e[i].en]%mo;
sum++;
}
if (!fa) f[x]=f[x]*g[sum]%mo;
else f[x]=f[x]*g[sum+1]%mo;
}
int calc()
{
if (!pd(1,0)) return 0;
for (int i=1;i<=n;i++) bz2[i]=false;
int ans=1;
for (int i=1;i<=n;i++)
if (!bz2[i]) dg(i,0),ans=ans*f[i]%mo;
return ans;
}
signed main()
{
scanf("%lld",&T);
g[0]=g[1]=1;
for (int i=2;i<=500000;i++)
g[i]=g[i-1]+g[i-2]*(i-1);
while (T--)
{
scanf("%lld%lld",&n,&m);
tot=1;top=0;
for (int i=1;i<=n;i++) bz2[i]=false,last[i]=0;
for (int i=1;i<=m;i++)
scanf("%lld%lld",&x,&y),add(x,y),add(y,x);
for (int i=2;i<=tot;i++) bz[i]=false;
printf("%lld\n",calc());
}
return 0;
}