Problem: You are given a set of n segments on the axis Ox, each segment has integer endpoints between 1 and m inclusive. Segments may intersect, overlap or even coincide with each other. Each segment is characterized by two integers l_i and r_i (1 ≤ l_i ≤ r_i ≤ m) — coordinates of the left and of the right endpoints. 

Consider all integer points between 1 and m inclusive. Your task is to print all such points that don't belong to any segment. The point x belongs to the segment [l; r] if and only if l ≤ x ≤ r.

Input

The first line of the input contains two integers n and m (1 ≤ n, m ≤ 100) — the number of segments and the upper bound for coordinates.

The next n lines contain two integers each l_i and r_i (1 ≤ l_i ≤ r_i ≤ m) — the endpoints of the i-th segment. Segments may intersect, overlap or even coincide with each other. Note, it is possible that l_i=r_i, i.e. a segment can degenerate to a point.

Output

In the first line print one integer k — the number of points that don't belong to any segment.

In the second line print exactly k integers in any order — the points that don't belong to any segment. All points you print should be distinct.

If there are no such points at all, print a single integer 0 in the first line and either leave the second line empty or do not print it at all.

Examples

Input

3 5
2 2
1 2
5 5


Output

2
3 4 


Input

1 7
1 7


Output

0

Note

In the first example the point 1 belongs to the second segment, the point 2 belongs to the first and the second segments and the point 5 belongs to the third segment. The points 3 and 4 do not belong to any segment.

In the second example all the points from 1 to 7 belong to the first segment.

Solution (in JAVA):

Solution:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;


public class Main {
	
	private static Scanner input = new Scanner(System.in);
		
	private static final int MOD = 1_000_000_000 + 7;
	
	public static void main(String[] args) {
		
		int n = input.nextInt();
		int m = input.nextInt();
		
		HashSet<Integer> set = new HashSet<>();
		
		while(n-->0) {
			int l = input.nextInt();
			int r = input.nextInt();
			for (int i = l; i <=r; i++) {
				set.add(i);
			}
		}
				
		int count = 0;
		ArrayList<Integer> list = new ArrayList<>();
		for (int i = 1; i <= m; i++) {
			if(!set.contains(i)) {
				count++;
				list.add(i);
			}
		}
	
		System.out.println(count);
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + " ");
		}
		

		
	}
	
	static int swapedArray (int [] a ) {
		
		int sum = 0;
		
		for (int i = 0; i < a.length; i++) {
			if(a[i]>i+1) {
				int temp = a[i]-(i+1);
				if(temp>2) {
					sum = Integer.MIN_VALUE;
					break;
				}
				else {
					sum+=temp;
				}
			}
		}
		
		return sum;
	}
	
	static int sumOfArray (int [] a) {
		
		int sum = 0;
		
		for (int i = 0; i < a.length; i++) {
			sum+=a[i];
		}
		
		return sum;
	}
		
	static long F (int n) {
		if(n==1) return 0;
		else if(n==2) return 1;
		
		long [] a = new long[n];

		a[0] = 0;
		a[1] = 1;
		
		long sum = 1;
		
		for (int i = 2; i < a.length; i++) {
			a[i] = (sum * i);
			sum+=a[i];
		}
	//	System.out.println(Arrays.toString(a));
		return a[n-1];
	}
	static void replace (int [] a, int n, int m) {
		for (int i = 0; i < a.length; i++) {
			if(a[i]==n) a[i] = m;
		}
	}
	static int Max (int [] a ) {
		int max = Integer.MIN_VALUE;
		
		for (int i = 0; i < a.length; i++) {
			max = Math.max(max, a[i]);
		}
		
		return max;
	}
	static int countOfOne (String S) {
		
		int count = 0;
		int max = Integer.MIN_VALUE;
		
		char [] cc = S.toCharArray();

		for (char c : cc)
		{
			if(c == '1') {
				count++;
			}
			else {
				max = Math.max(max, count);
				count = 0;
			}
		}
		
		return max = Math.max(max, count);
	}

	static int bubbleSort (int [] a) {
		
		int count = 0;
		
		for (int i = 0; i < a.length - 1; i++) {
			for (int j = i+1; j < a.length; j++) {
				if(a[j]<a[i]) {
					int temp = a[j];
					a[j] = a[i];
					a[i] = temp;
					count++;
				}
			}
		}
		
		return count;
	}
	static int minInRange (int [] a, int l, int r) {
		int min = a[l];
		
		for (int i = l+1; i <=r; i++) {
			min = Math.min(a[i], min);
		}
		
		return min;
	}
	
	static boolean isVowel (char c) {
		char [] vowels = {'a','o','u','i','e'};
		Arrays.sort(vowels);
		return Arrays.binarySearch(vowels, c) >= 0;
	}
	
	static int []  readAnArray (int [] a)
	{		
		for (int i = 0; i < a.length; i++) {
			a[i] = input.nextInt();
		}
	
		return a;
	}
	
	static boolean isPrime (int n) {
		
		if(n<2) return false;
		
		for (int i = 2; i*i<=n; i++) {
			if(n%i==0) return false;
		}
		
		return true;
	}
	
}