Dreamoon loves summing up something for no reason. One day he obtains two integers a and b occasionally. He wants to calculate the sum of all nice integers. Positive integer x is called nice if <image> and <image>, where k is some integer number in range [1, a].

By <image> we denote the quotient of integer division of x and y. By <image> we denote the remainder of integer division of x and y. You can read more about these operations here: http://goo.gl/AcsXhT.

The answer may be large, so please print its remainder modulo 1 000 000 007 (109 + 7). Can you compute it faster than Dreamoon?

Input

The single line of the input contains two integers a, b (1 ≤ a, b ≤ 107).

Output

Print a single integer representing the answer modulo 1 000 000 007 (109 + 7).

Examples

Input

1 1


Output

0


Input

2 2


Output

8

Note

For the first sample, there are no nice integers because <image> is always zero.

For the second sample, the set of nice integers is {3, 5}.
import static java.lang.System.in;

import java.io.IOException;


public class C272 {
    
    static byte[] buffer = new byte[8192];
    static int offset = 0;
    static int bufferSize = 0;
    public static void main(String args[])throws IOException
    {
        long a =readLong();
        long b = readLong();
        long mod  =1000000007;
        long a1 = ((a*(a+1))/2)%mod;
        long b1 = ((b*(b-1))/2)%mod;
        long a2  = (a1 *b)%mod;
        
        long ans  =  ((a2+a))%mod;
        ans =  (ans *b1)%mod;
        
        if (b==1)
            System.out.println(0);
        else
            System.out.println(ans);
        
    }
    
    static long readLong() throws IOException{
        long number = 0;
        long s=1;
        if(offset==bufferSize){
            offset = 0;
            bufferSize = in.read(buffer);
        }
        for(;buffer[offset]<0x30; ++offset)
        {
            if (buffer[offset]=='-')
                s=-1;
            if(offset==bufferSize-1){
                offset=-1;
                bufferSize = in.read(buffer);
            }
        }
        for(;offset<bufferSize && buffer[offset]>0x2f;++offset){
            number = number*0x0a+buffer[offset]-0x30;
            if(offset==bufferSize-1){
                offset = -1;
                bufferSize = in.read(buffer);
            }
        }
        ++offset;
        return number*s;
    }


}
