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.io.*;

public class B {
    int[] a;
    boolean[] u;

    int[][] p;
    int n;

    boolean bt(int x, int y, int from) {
        if (x == n) {
            return true;
        }
        if (y == 4) {
            return bt(x + 1, 0, from);
        }
        for (int i = y == 0 ? x : from; i < 4 * n; i++) {
            if (!u[i]) {
                p[x][y] = a[i];
                u[i] = true;
                if (bt(x, y + 1, y == 0 ? from : i + 1)) {
                    return true;
                }
                u[i] = false;
            }
        }
        return false;
    }

    int gcd(int x, int y) {
        while (y != 0) {
            int t = y;
            y = x % y;
            x = t;
        }
        return x;
    }

    public void run() throws IOException {
        in = new FastScanner(System.in);
        out = new PrintWriter(System.out);

        n = in.nextInt();
        int k = in.nextInt();
        a = new int[4 * n];
        int v = 2;
        for (int i = 1; i <= n; i++) {
            a[i - 1] = v;
            v += 2;
            if (v % 3 == 0) {
                v += 2;
            }
        }
        for (int i = 1; i <= 3 * n; i++) {
            a[n + i - 1] = 2 * i - 1;
        }
//        Arrays.sort(a);
        p = new int[n][4];
        u = new boolean[4 * n];
        bt(0, 0, n);

        out.println(a[4 * n - 1] * k);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 4; j++) {
                out.print(p[i][j] * k);
                if (j < 3) {
                    out.print(" ");
                }
            }
            out.println();
        }

        out.close();
    }

    FastScanner in;
    PrintWriter out;

    public static void main(String[] args) throws IOException {
        new B().run();
    }

    static class FastScanner {
        BufferedReader br;
        StringTokenizer st;

        FastScanner(InputStream in) throws IOException {
            br = new BufferedReader(new InputStreamReader(in));
        }

        String next() {
            try {
                while (st == null || !st.hasMoreTokens()) {
                    st = new StringTokenizer(br.readLine());
                }
            } catch (IOException e) {
                System.err.println(e);
                System.exit(1);
            }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        long nextLong() {
            return Long.parseLong(next());
        }
    }
}