//递归遍历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;
}