Initialization of an array
In many programming languages, there are functions designed to fill an entire array or a portion of it with a specific value. In Pascal, this function is fillchar(), in Java it's Arrays.fill(), and in C++ it's memset(). In the new programming language J#, a function called mark() has been introduced, which is specifically for arrays of boolean type.
The mark function, when called with two parameters a and b, sets all elements of the array from index a to b inclusive to true. For instance, consider an array of length 4, where elements are indexed starting from one and all values are initially false. If you perform the operations mark(1, 3) and mark(2, 4), the entire array will be filled with true values.
A common task for beginners learning J# is to write a program that uses exactly M mark operations to completely fill an array of length N with true values, starting from an array filled with false values.
You have quickly solved this task and are now curious: how many different ways can this be achieved? Two ways are considered different if, for at least one i from 1 to M, the i-th mark operation in the two programs uses different parameters. This number can be large, so it should be calculated modulo 10^9+7.
Input
The first line of the input contains two natural numbers N and M — the length of the array and the number of mark operations required in the program (1 ≤ N, M ≤ 70).
Output
Output a single line with the remainder when the number of ways to fill an array of N elements with true values using M mark operations is divided by 10^9+7.
Explanation of the example
The possible variants are:
mark(1, 1); mark(1, 2)
mark(1, 1); mark(2, 2)
mark(1, 2); mark(1, 1)
mark(1, 2); mark(1, 2)
mark(1, 2); mark(2, 2)
mark(2, 2); mark(1, 1)
mark(2, 2); mark(1, 2)