#include <bits/stdc++.h>
using namespace std;
struct Bus {
  long long s, t;
};
bool cmp(Bus &a, Bus &b) { return a.t < b.t; }
long long n, m, it[4 * 111111], tmp = 1, l, r;
Bus bus[111111];
vector<long long> positions;
void update(int idx, int l, int r, int pos, long long val) {
  if (pos < l || pos > r) return;
  if (l == r) {
    it[idx] = val;
    return;
  }
  int m = (l + r) / 2;
  update(2 * idx, l, m, pos, val);
  update(2 * idx + 1, m + 1, r, pos, val);
  it[idx] = (it[2 * idx] + it[2 * idx + 1]) % 1000000007;
}
long long get(int idx, int l, int r, int u, int v) {
  if (v < l || r < u) return 0;
  if (u <= l && r <= v) return it[idx];
  int m = (l + r) / 2;
  long long ret =
      (get(2 * idx, l, m, u, v) + get(2 * idx + 1, m + 1, r, u, v)) %
      1000000007;
  return ret;
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < m; i++) cin >> bus[i].s >> bus[i].t;
  sort(bus, bus + m, cmp);
  positions.push_back(0);
  for (int i = 0; i < m; i++)
    if (bus[i].t != positions[positions.size() - 1])
      positions.push_back(bus[i].t);
  if (n != positions[positions.size() - 1]) positions.push_back(n);
  update(1, 0, positions.size() - 1, 0, 1);
  for (int i = 0; i < m; i++) {
    l = lower_bound(positions.begin(), positions.end(), bus[i].s) -
        positions.begin();
    r = upper_bound(positions.begin(), positions.end(), bus[i].t) -
        positions.begin() - 1;
    tmp = get(1, 0, positions.size() - 1, l, r);
    update(1, 0, positions.size() - 1, r, tmp);
  }
  cout << get(1, 0, positions.size() - 1, positions.size() - 1,
              positions.size() - 1);
}
