#include <bits/stdc++.h>
using namespace std;
typedef long long lol;

//マクロ
//forループ関係
//引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
//Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i,n) for(lol i=0;i<lol(n);i++)
#define REPD(i,n) for(lol i=n-1;i>=0;i--)
#define FOR(i,a,b) for(lol i=a;i<=lol(b);i++)
#define FORD(i,a,b) for(lol i=a;i>=lol(b);i--)
#define VL vector<lol>
//xにはvectorなどのコンテナ
#define ALL(x) x.begin(),x.end() //sortなどの引数を省略したい
#define SIZE(x) lol(x.size()) //sizeをsize_tからllに直しておく
//定数
#define PI 3.1415926535897932385 //pi
#define INF 1000000000000 //10^12:極めて大きい値,∞
#define MOD 998244353 //10^9+7:合同式の法
#define MAXR 100000 //10^5:配列の最大のrange(素数列挙などで使用)
//最大値最小値
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
int gcd(int a,int b){return b?gcd(b,a%b):a;}
//繰り返し二乗法
int modPow(long long a, long long n, long long p) {
    if (n == 0) return 1; // 0乗にも対応する場合
    if (n == 1) return a % p;
    if (n % 2 == 1) return (a * modPow(a, n - 1, p)) % p;
    long long t = modPow(a, n / 2, p);
    return (t * t) % p;
}

int main()
{
    lol result{0};
    lol n, k; cin >> n >> k;
    lol a[200005] = {};
    lol count = 0;
    vector<lol> l(k), r(k);
    REP(i, k)
    {
        cin >> l[i] >> r[i];
    }
    sort(ALL(l)), sort(ALL(r));
    REP(i, k)
    {
        lol li = l[i], ri = r[i];
        FOR(j, li, ri)
        {
            a[count] = j;
            count++;
        }
    }
    //sort(ALL(a));
    //FOR(j, 200005 - count, 200004) cout << a[j] << " ";
    lol b[n+1] = {};
    b[1] = 1;
    FOR(i, 2, n)
    {
        //bool TF = false;
        REP(j, count)
        {
            if(i-a[j] < 1) break;
            else
            {
                b[i] += b[i-a[j]];
                b[i]%=MOD;
            }
            
        }
    }
    result = b[n]%MOD;    

    cout << result << endl;
    return 0;
}