Problem: Dreamoon likes to play with sets, integers and <image>. <image> is defined as the largest positive integer that divides both a and b.

Let S be a set of exactly four distinct integers greater than 0. Define S to be of rank k if and only if for all pairs of distinct elements si, sj from S, <image>.

Given k and n, Dreamoon wants to make up n sets of rank k using integers from 1 to m such that no integer is used in two different sets (of course you can leave some integers without use). Calculate the minimum m that makes it possible and print one possible solution.

Input

The single line of the input contains two space separated integers n, k (1 ≤ n ≤ 10 000, 1 ≤ k ≤ 100).

Output

On the first line print a single integer — the minimal possible m. 

On each of the next n lines print four space separated integers representing the i-th set.

Neither the order of the sets nor the order of integers within a set is important. If there are multiple possible solutions with minimal m, print any one of them.

Examples

Input

1 1


Output

5
1 2 3 5


Input

2 2


Output

22
2 4 6 22
14 18 10 16

Note

For the first example it's easy to see that set {1, 2, 3, 4} isn't a valid set of rank 1 since <image>.

Solution (in JAVA):

Solution:
import java.util.*;
import java.math.*;
import java.io.PrintStream;
import static java.lang.Math.*;

public class Task272D {

	public static Scanner in = new Scanner(System.in);
	public static PrintStream out = System.out;

	/*public static class Four {
		public int[] arr = new int[4];
		public Four() {
			arr[0] = arr[1] = arr[2] = arr[3] = 0;
		}
		public Four(int[] arr) {
			for (int i = 0; i < arr.length; i++) {
				this.arr[i] = arr[i];
			}
		}
	}
	
	public static int gcd (int a, int b) {
		int t;
		while (b != 0) {
			a %= b;
			t = a;
			a = b;
			b = t;
		}
		return a;
	}*/
	
	public static void main(String[] args) {
		int n = in.nextInt();
		int k = in.nextInt();
		
		/*TreeSet<Integer> set = new TreeSet<>();
		for (int i = 1; i < 1000000; i++) {
			set.add(i);
		}
		
		Four curr = null;
		ArrayList<Four> result = new ArrayList<>(n);
		Iterator<Integer> it = set.iterator();
		for (int i = 0; i < n; i++) {
			curr = new Four();
			curr.arr[0] = it.next();
			do {
				curr.arr[1] = it.next();
			} while(gcd(curr.arr[0], curr.arr[1]) != 1);
			do {
				curr.arr[2] = it.next();
			} while(gcd(curr.arr[0], curr.arr[2]) != 1 || gcd(curr.arr[1], curr.arr[2]) != 1);
			do {
				curr.arr[3] = it.next();
			} while(gcd(curr.arr[0], curr.arr[3]) != 1 || gcd(curr.arr[1], curr.arr[3]) != 1 || gcd(curr.arr[2], curr.arr[3]) != 1);
			for (int j: curr.arr) {
				set.remove(j);
			}
			result.add(curr);
		}
		
		out.println(curr.arr[3] * k);
		for (Four four: result) {
			for (int x: four.arr) {
				out.print((x * k) + " ");
			}
			out.println();
		}*/
		
		out.println(k * (6 * n - 1));
		for (int i = 0; i < n; i++) {
			out.println(k * (1 + 6 * i) + " " + k * (3 + 6 * i) + " " + k * (4 + 6 * i) + " " + k * (5 + 6 * i));
		}
	}

}