#include <stdio.h>
#include <stdlib.h>
#define MAXN 500001

int n, m;
int a [MAXN], b [MAXN], p [MAXN];
int count;
int sol [MAXN];

void input ()
{
	FILE *in;
	in = fopen ("teleport.in", "r");
	fscanf (in, "%d %d", &n, &m);
	for (int i = 0; i < n; i++)
		fscanf (in, "%d %d", &a [i], &b [i]);
	fclose (in);
}

int compare (const void *x, const void *y)
{
	int i = *(int*) x;
	int j = *(int*) y;
	if ((a [i] < a [j]) || ((a [i] == a [j]) && (b [i] > b [j])))
		return -1;
	if ((a [i] > a [j]) || ((a [i] == a [j]) && (b [i] < b [j])))
		return 1;
	return 0;
}

bool covered ()
{
	int right = 0;
	for (int i = 0; i < n; i++)
	{
		if (a [p [i]] > right + 1)
			return false;
		if (right < b [p [i]])
			right = b [p [i]];
	}
	return true;
}

void find_nonested ()
{
	int i = 0;
	while ((i < n) && (a [p [i]] == 0) && (b [p [i]] == 0))
		i++;
	int max = 0;
	while (i < n)
	{
		if (b [p [i]] > max)
		{
			if ((i < n) && !((a [p [i]] == a [p [i + 1]]) && (b [p [i]] == b [p [i + 1]])))
			{
				sol [count] = p [i];
				count++;
			}
			max = b [p [i]];
		}
		i++;
	}
}

void solve ()
{
	for (int i = 0; i < n; i++)
		p [i] = i;
	qsort (p, n, sizeof (int), compare);
	count = 0;
	if (covered () == true)
		find_nonested ();
}

void output ()
{
	FILE *out;
	out = fopen ("teleport.out", "w");
	fprintf (out, "%d\n", count);
	for (int i = 0; i < count; i++)
		fprintf (out, "%d ", sol [i] + 1);
	fclose (out);
}

int main ()
{
	input ();
	solve ();
	output ();
}
