#include <bits/stdc++.h>
using namespace std;
class Splay {
 public:
  struct node {
    int l, r, p, key, c;
  };
  node a[200010];
  int len, root;
  void clear() {
    len = 0;
    root = 0;
    a[0].l = a[0].r = a[0].key = 0;
  }
  Splay() { clear(); }
  int newnode(int key, int cc) {
    int x = ++len;
    a[x].l = a[x].r = a[x].p = 0;
    a[x].key = key;
    a[x].c = cc;
    return x;
  }
  void update(int x) {}
  void zig(int x) {
    int y = a[x].p, z = a[y].p;
    if (a[z].l == y)
      a[z].l = x;
    else
      a[z].r = x;
    a[x].p = z;
    a[y].p = x;
    a[y].l = a[x].r;
    a[x].r = y;
    a[a[y].l].p = y;
    update(y);
  }
  void zag(int x) {
    int y = a[x].p, z = a[y].p;
    if (a[z].l == y)
      a[z].l = x;
    else
      a[z].r = x;
    a[x].p = z;
    a[y].p = x;
    a[y].r = a[x].l;
    a[x].l = y;
    a[a[y].r].p = y;
    update(y);
  }
  void splay(int &root, int x) {
    int y, z, fa = a[root].p;
    if (x == 0) return;
    while (a[x].p != fa) {
      y = a[x].p;
      z = a[y].p;
      if (z == fa) {
        if (x == a[y].l)
          zig(x);
        else
          zag(x);
      } else if (y == a[z].l)
        if (x == a[y].l) {
          zig(y);
          zig(x);
        } else {
          zag(x);
          zig(x);
        }
      else if (x == a[y].r) {
        zag(y);
        zag(x);
      } else {
        zig(x);
        zag(x);
      }
    }
    update(x);
    root = x;
  }
  void insert(int &root, int key, int cc) {
    int x = root, y = 0, z = newnode(key, cc);
    if (root == 0) {
      root = z;
      return;
    }
    while (x) {
      y = x;
      if (a[z].key < a[x].key)
        x = a[x].l;
      else
        x = a[x].r;
    }
    a[z].p = y;
    if (a[z].key < a[y].key)
      a[y].l = z;
    else
      a[y].r = z;
    splay(root, z);
  }
  int fmin(int x) {
    while (a[x].l) x = a[x].l;
    return x;
  }
  int find(int x, int key) {
    if (x == 0) return 0;
    if (key == a[x].key) return x;
    if (key < a[x].key)
      return find(a[x].l, key);
    else
      return find(a[x].r, key);
  }
  void print(int x) {
    if (x == 0) return;
    print(a[x].l);
    printf("out%d %d\n", a[x].key, a[x].c);
    print(a[x].r);
  }
  void delmin() {
    int tmp = fmin(root);
    splay(root, tmp);
    a[a[root].r].p = 0;
    root = a[root].r;
  }
};
Splay a;
int n, m, l[100010], r[100010], Left[100010], Right[100010],
    len = 0, x, y, ans = 0, out[100010], c[100010], i, j, tmp;
void Q(int s, int t) {
  int m, p;
  int i = s;
  int j = t;
  m = l[(i + j) / 2];
  do {
    while (l[i] < m) i++;
    while (l[j] > m) j--;
    if (i <= j) {
      p = l[i];
      l[i] = l[j];
      l[j] = p;
      p = r[i];
      r[i] = r[j];
      r[j] = p;
      p = c[i];
      c[i] = c[j];
      c[j] = p;
      i++;
      j--;
    }
  } while (i <= j);
  if (i < t) Q(i, t);
  if (s < j) Q(s, j);
}
inline void read(int &x) {
  char ch;
  int bo = 0;
  x = 0;
  for (ch = getchar(); !(ch >= '0' && ch <= '9'); ch = getchar())
    if (ch == '-') bo = 1;
  for (; ch >= '0' && ch <= '9'; x = x * 10 + ch - '0', ch = getchar())
    ;
  if (bo) x = -x;
}
int main() {
  scanf("%d%d", &n, &m);
  for (i = 1; i <= m; i++) {
    ++len;
    read(l[len]);
    read(r[len]);
    c[len] = i;
  }
  Q(1, len);
  for (i = 1; i <= n; i++) Right[i] = -1;
  for (i = 1; i <= len; i++) {
    if (Left[l[i]] == 0) Left[l[i]] = i;
    Right[l[i]] = i;
  }
  for (i = n; i; i--) {
    for (j = Left[i]; j <= Right[i]; j++) {
      a.insert(a.root, r[j], c[j]);
    }
    tmp = a.fmin(a.root);
    while (tmp && a.a[tmp].key <= n - i) {
      a.delmin();
      tmp = a.fmin(a.root);
    }
    if (tmp) {
      ans++;
      out[ans] = a.a[tmp].c;
      a.delmin();
    }
  }
  printf("%d\n", ans);
  if (ans) sort(out + 1, out + ans + 1);
  for (i = 1; i < ans; i++) printf("%d ", out[i]);
  if (ans)
    printf("%d\n", out[ans]);
  else
    printf("\n");
}
