//
//  main.cpp
//  A
//
//  Created by E SAMEER KUMAR on 09/04/20.
//  Copyright © 2020 E SAMEER KUMAR. All rights reserved.

#include <bits/stdc++.h>
using ll = long long;
using namespace std;
//map<int,vector<int>> tree;
//map<int,vector<int>> rooted;
//map<int,int> primes;
void debugi(vector<int> & vec){
    int n=(int)vec.size();
    for(int i=0;i<n;i++){
        cout<<vec[i]<<" ";
    }
    cout<<endl;
}
void debugl(vector<ll> & vec){
    int n=(int)vec.size();
    for(int i=0;i<n;i++){
        cout<<vec[i]<<" ";
    }
    cout<<endl;
}
void debugmap(map<int,int> & mp){
    for(auto x:mp){
        cout<<x.first<<" "<<x.second<<" , ";
    }
    cout<<endl;
}
void debugset(set<int> & st){
    for(auto x: st){
        cout<<x<<" ";
    }
    cout<<endl;
}
void debugparri(vector<pair<int, int>>& arr){
    for(int i=0;i<(int)arr.size();i++){
        cout<<"["<<arr[i].first<<" : "<<arr[i].second<<"]"<<" ";
    }
    cout<<endl;
}
void debugpi(pair<int, int> &pi){
    cout<<pi.first<<" "<<pi.second<<endl;
}
void debugq(queue<int> q){
    while(!q.empty()){
        cout<<q.front()<<" ";
        q.pop();
    }
    cout<<endl;
}

bool check(int n,int i,int j){
    if((0<=i & i<n) && (0<=j & j<n)){
        return true;
    }
    return false;
}
// ll MOD = 1e9+7;
ll mod = 998244353;
ll powab(ll a,ll b,ll mod){
    if(b==0){
        return 1;
    }
    ll z=powab(a, b/2, mod);
    ll res=(z*z*1LL)%mod;
    if(b&1){
        res=(res*1LL*a)%mod;
    }
    return res;
}
// char s[100006];
// int m=200005;
// int p;
//int mod(int x,int mod){
//    if(x<0){
//        return mod-(x%mod);
//    }
//    else{
//        return x%mod;
//    }
//}
//ll modinv(ll a){
//    ll ans=powab(a, mod-2, mod);
//    return ans;
//}

int lim=10;
int n;
vector<vector<pair<int,ll>>>g(lim);
vector<int> vis(lim);
vector<ll> dp(lim),a(lim);
int dia=0,node=0;
int ind = 0;
ll gcd(ll a, ll b){
    if(b==0){
        return a;
    }
    return gcd(b,a%b);
}
void upd(int k, int x,vector<int>& tree,int n){
//    cout<<k<<" k "<<endl;
    if(k==0){
        return;
    }
//    cout<<k<<" k "<<endl;
    while(k<=n){
//        cout<<k<<" kk "<<endl;
        tree[k]+=x;
        k+=(k&-k);
    }
}
int sum(int k,vector<int>& tree,int n){
    int s=0;
    while(k>=1){
        s+=tree[k];
        k-=(k&-k);
    }
    return s;
}
int x,k;
vector<int> sieve(1000010,0);
void fill(){
    // cout<<"sra"<<endl;
    for(int i=2;i<=1000004;i++){
        // cout<<i<<endl;
        if(sieve[i]==0){
            sieve[i]=i;
            for(int j=i;j<=1000004;j+=i){
                sieve[j]=i;
            }
        }
    }
    // cout<<"filled"<<endl;
}
void solve(){
    int n,k;
    cin>>n>>k;
    vector<pair<int,int>> arr(k);
    for(int i=0;i<k;i++){
        int x,y;
        cin>>x>>y;
        arr[i].first=x;arr[i].second=y;
    }
    vector<ll> dp(n+5,0);
    dp[0]=1;dp[1]=-1;
    ll s=0,mod=998244353;
    for(int i=0;i<n;i++){

        // debugl(dp);
        s+=dp[i];
        // cout<<s<<" s "<<endl;
        s=(s+mod)%mod;
        for(int j=0;j<k;j++){
            int l=arr[j].first,r=arr[j].second;
            int low=l+i,high=min(n,r+i);
            if(low>n){
                continue;
            }
            dp[low]+=s;
            dp[low]=(dp[low]+mod)%mod;
            // dp[low]%=mod;
            dp[high+1]-=s;
            dp[high+1]=(dp[high+1]+mod)%mod;
            // dp[high+1]%=mod;
        }
    }
    // debugl(dp);
    cout<<s<<endl;
}
int main(int argc, const char * argv[]) {
    // insert code here...
    // ofstream file;
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL);
    int t;
    // cin >> t;
    t = 1;
    for(int tt=0;tt<t;tt++){
        solve();
    }
    return 0;
}

Measured memory_bytes: 8736