//递归遍历m个线段选或者不选的情况。
//使用1-n的差分数组记录每个点被几个线段覆盖
#include <bits/stdc++.h>
using namespace std;
int n,m,ans=0;
vector<pair<int,int>> xd(10);
bool pand(vector<int> &cf){
int sum=0;
for(int i=1;i<=n;i++){
sum+=cf[i];
if(sum<2)return false;
}
return true;
}
void dfs(int index,vector<int> &cf){
if(index==m){
if(pand(cf)){
ans++;
ans%=998244353;
}
return ;
}
cf[xd[index].first]++;
cf[xd[index].second+1]--;
dfs(index+1,cf);
cf[xd[index].first]--;
cf[xd[index].second+1]++;
dfs(index+1,cf);
}
int main() {
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>xd[i].first>>xd[i].second;
}
vector<int> cf(n+2,0);
dfs(0,cf);
cout<<ans;
}