using namespace std;
typedef long long ll;
const ll N=5e5+3,M=605,H=998244353;
ll n,m,tot,pos[N],fa[N],f[M][M];
queue<int>q;
bool vis[N];
map<int,array<ll,2>>mp[N];
void Add(ll &x,ll y){x=(x+y)%H;}
int F(int x){return fa[x]==x?x:fa[x]=F(fa[x]);}
void Mer(int x,int y){if(F(x)!=F(y))fa[F(x)]=F(y);}
ll Inv(ll x){return x<=1?x:H-H/x*Inv(H%x)%H;}
void Upd(int x){if(mp[x].size()<=2&&!vis[x])q.push(x),vis[x]=1;}
void Mdf(int x,int y,array<ll,2> A)
{
if(!mp[x].count(y)){mp[x][y]=mp[y][x]=A;return;}
array<ll,2> B=mp[x][y];
mp[x][y]=mp[y][x]={A[0]*B[0]%H,(A[0]*B[1]+A[1]*B[0])%H};
}
void Link(int x,int y,ll d)
{
Add(f[x][x],d);Add(f[y][y],d);
Add(f[x][y],H-d);Add(f[y][x],H-d);
}
ll Det()
{
ll s=1;tot--;
for(int i=1;i<=tot;i++)
{
int z=i;
while(z<=tot&&!f[z][i])z++;
if(z>tot)return 0;
if(z>i)swap(f[z],f[i]),s=H-s;
ll v=Inv(f[i][i]);s=s*f[i][i]%H;
for(int j=2;j<=tot;j++)if(j!=i)
{
ll d=f[j][i]*v%H;
for(int k=i+1;k<=tot;k++)Add(f[j][k],H-f[i][k]*d%H);
}
}
return s;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;n++;iota(fa+1,fa+n+1,1);ll res=1;
for(int i=1,l,r;i<=m;i++)cin>>l>>r,r++,Mdf(l,r,{1,1}),Mer(l,r);
for(int i=1;i<=n;i++)if(F(i)!=F(1)){cout<<0;return 0;}
for(int i=1;i<=n;i++)Upd(i);
while(q.size())
{
int x=q.front();q.pop();
if(mp[x].size()==1)res=res*(mp[x].begin()->second)[1]%H;
if(mp[x].size()==2)
{
auto [u,A]=*mp[x].begin();
auto [v,B]=*mp[x].rbegin();
Mdf(u,v,{(A[0]*B[1]+A[1]*B[0])%H,A[1]*B[1]%H});
}
for(auto [u,A]:mp[x])mp[u].erase(x),Upd(u);
}
for(int i=1;i<=n;i++)if(!vis[i])pos[i]=++tot;
for(int u=1;u<=n;u++)if(!vis[u])for(auto [v,A]:mp[u])if(u<v)
res=res*A[0]%H,Link(pos[u],pos[v],A[1]*Inv(A[0])%H);
cout<<res*Det()%H;
}