def getsum(BITTree, i):
    s = 0
    i = i + 1
    while i > 0:
        s += BITTree[i]
        i -= i & (-i)
    return s
def updatebit(BITTree, n, i, v):
    i += 1
    while i <= n:
        BITTree[i] += v
        i += i & (-i)
def construct(arr, n):
    BITTree = [0] * (n + 1)
    for i in range(n):
        updatebit(BITTree, n, i, arr[i])
    return BITTree
n,k=map(int,input().split())
c=[]
a=[0]*(n+1)
a[1]=1
BITTree = construct(a,len(a))
mod=998244353
for i in range(k):
    x,y=map(int,input().split())
    c.append([x,y])
for i in range(2,n+1):
    for j in range(len(c)):
        p,q=c[j][0],c[j][1]
        if i-q>0:
            l,r=i-p,i-q
            z=(getsum(BITTree,l)-getsum(BITTree,r-1))%mod
            a[i]+=z
            updatebit(BITTree, len(a), i,z)
        else:
            q=i-1
            if i-q>0 and i-p>0:
                l, r = i - p, i - q
                z = (getsum(BITTree, l) - getsum(BITTree, r - 1))%mod
                a[i]+=z
                updatebit(BITTree, len(a), i, z)
print(a[n]%mod)






