#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
double fixAngle(double A) { return A > 1 ? 1 : (A < -1 ? -1 : A); }
double dcmp(double a, double b) {
  return fabs(a - b) < 1e-6 ? 0 : a > b ? 1 : -1;
}
const int MAX_SIZE = 3e5 + 5;
const int MOD = 1e9 + 7;
int r = 0;
long long segtree[MAX_SIZE * 4];
void update(long long L, long long R, long long t, long long val,
            long long idx) {
  if (L == R && R == t) {
    segtree[idx] += val;
    segtree[idx] %= MOD;
    return;
  }
  if (L > t || R < t) return;
  update(L, (L + R) / 2, t, val, idx * 2);
  update((L + R) / 2 + 1, R, t, val, idx * 2 + 1);
  segtree[idx] = (segtree[idx * 2] + segtree[idx * 2 + 1]) % MOD;
}
long long query(long long L, long long R, long long tl, long long tr,
                long long idx) {
  if (L >= tl && R <= tr) {
    return segtree[idx] % MOD;
  }
  if (L > tr || R < tl) return 0;
  return (query(L, (L + R) / 2, tl, tr, idx * 2) +
          query((L + R) / 2 + 1, R, tl, tr, idx * 2 + 1)) %
         MOD;
}
map<long long, long long> rnk;
int main() {
  set<long long> tmp;
  long long n, m, a, b;
  vector<pair<long long, long long> > data;
  cin >> n >> m;
  tmp.insert(0);
  tmp.insert(n);
  for (long long i = 0; i < m; i++) {
    cin >> a >> b;
    data.push_back({b, a});
    tmp.insert(a);
    tmp.insert(b);
    tmp.insert(b - 1);
  }
  for (long long x : tmp) {
    rnk[x] = ++r;
  }
  sort(data.begin(), data.end());
  update(0, MAX_SIZE - 1, 1, 1, 1);
  for (int i = 0; i < m; i++) {
    swap(data[i].second, data[i].first);
    int x =
        query(0, MAX_SIZE - 1, rnk[data[i].first], rnk[data[i].second - 1], 1);
    update(0, MAX_SIZE - 1, rnk[data[i].second], x, 1);
  }
  cout << query(0, MAX_SIZE - 1, rnk[n], rnk[n], 1) % MOD;
}
