#include <bits/stdc++.h>
using namespace std;
template <class T>
bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return true;
  } else
    return false;
}
template <class T>
bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return true;
  } else
    return false;
}
using ll = long long;
using ld = long double;
using vi = vector<int>;
using vl = vector<ll>;
using Pi = pair<int, int>;
using Pl = pair<ll, ll>;
using vpi = vector<Pi>;
using vpl = vector<Pl>;
template <class T>
ostream& operator<<(ostream& out, const vector<T>& arr) {
  cout << "{";
  for (int i = 0; i < arr.size(); i++) cout << (!i ? "" : ", ") << arr[i];
  cout << "}";
  return out;
}
template <class T>
ostream& operator<<(ostream& out, const vector<vector<T> >& arr) {
  cout << "{\n";
  for (auto& vec : arr) cout << "  " << vec << ",\n";
  cout << "}";
  return out;
}
template <class S, class T>
ostream& operator<<(ostream& out, const pair<S, T>& p) {
  cout << "{" << p.first << "," << p.second << "}" << '\n';
  return out;
}
template <class T>
istream& operator>>(istream& in, vector<T>& arr) {
  for (auto& i : arr) cin >> i;
  return in;
}
template <int mod>
struct Modint {
  long long x;
  Modint(long long x = 0) : x((x % mod + mod) % mod) {}
  Modint& operator+=(const Modint a) {
    if ((x += a.x) >= mod) x -= mod;
    return *this;
  }
  Modint& operator-=(const Modint a) {
    if ((x += mod - a.x) >= mod) x -= mod;
    return *this;
  }
  Modint& operator*=(const Modint a) {
    (x *= a.x) %= mod;
    return *this;
  }
  Modint operator+(const Modint a) const {
    Modint res(*this);
    return res += a;
  }
  Modint operator-(const Modint a) const {
    Modint res(*this);
    return res -= a;
  }
  Modint operator*(const Modint a) const {
    Modint res(*this);
    return res *= a;
  }
  Modint pow(ll t) const {
    if (!t) return 1;
    Modint a = pow(t >> 1);
    a *= a;
    if (t & 1) a *= *this;
    return a;
  }
  Modint inv() const { return pow(mod - 2); }
  Modint& operator/=(const Modint a) { return (*this) *= a.inv(); }
};
using mint = Modint<998244353>;
template <class T>
class RangeSumQuery {
 private:
  vector<T> dat;
  int n;
  T INF;

 public:
  RangeSumQuery(int n_) {
    INF = 0;
    n = 1;
    while (n < n_) n *= 2;
    dat.assign(2 * n - 1, INF);
  }
  void update(int k, T a) {
    k += n - 1;
    dat[k] = a;
    while (k > 0) {
      k = (k - 1) / 2;
      dat[k] = dat[k * 2 + 1] + dat[k * 2 + 2];
    }
  }
  T query(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l) return INF;
    if (a <= l && r <= b)
      return dat[k];
    else {
      T vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
      T vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
      return vl + vr;
    }
  }
  T query(int a, int b) { return query(a, b, 0, 0, n); }
};
mint dp[100010];
int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n, k;
  cin >> n >> k;
  RangeSumQuery<mint> ST(n + 1);
  vector<Pi> range(k);
  for (int i = 0; i < k; i++) {
    cin >> range[i].first >> range[i].second;
  }
  sort((range).begin(), (range).end());
  dp[0] = 1;
  ST.update(0, 1);
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < k; j++) {
      int l = i - range[j].second;
      int r = i - range[j].first + 1;
      if (r < 0) continue;
      dp[i] += ST.query(max(0, l), r);
      ST.update(i, dp[i]);
    }
  }
  cout << dp[n - 1].x << '\n';
  return 0;
}
