Problem:
Score : 700 points

Problem Statement

Given are positive integers N and K.

Determine if the 3N integers K, K+1, ..., K+3N-1 can be partitioned into N triples (a_1,b_1,c_1), ..., (a_N,b_N,c_N) so that the condition below is satisfied. Any of the integers K, K+1, ..., K+3N-1 must appear in exactly one of those triples.

For every integer i from 1 to N, a_i + b_i \leq c_i holds.

If the answer is yes, construct one such partition.

Constraints

1 \leq N \leq 10^5

1 \leq K \leq 10^9

Input

Input is given from Standard Input in the following format:

N K

Output

If it is impossible to partition the integers satisfying the condition, print -1. If it is possible, print N triples in the following format:

a_1 b_1 c_1
:
a_N b_N c_N

Sample Input 1

1 1

Sample Output 1

1 2 3

Sample Input 2

3 3

Sample Output 2

-1

Solution in Rust (1.15.1) (judge verdict: Accepted)

#![allow(non_snake_case)]
#![allow(unused_variables)]
#![allow(dead_code)]

fn main() {
    let (N, K): (usize, usize) = {
        let mut line: String = String::new();
        std::io::stdin().read_line(&mut line).unwrap();
        let mut iter = line.split_whitespace();
        (
            iter.next().unwrap().parse().unwrap(),
            iter.next().unwrap().parse().unwrap()
        )
    };

    let mut a = vec![0; N];
    let mut b = vec![0; N];
    let c = (0..N).map(|i| K + 2 * N + i).collect::<Vec<_>>();
    let m = (N - 1) / 2;
    let mut j = m;
    for x in (K..(K + N)).rev() {
        a[j] = x;
        j = (j + 1) % N;
    }
    for i in 0..m { b[i] = K + N + 2 * i + 1; }
    for i in m..N { b[i] = std::cmp::min(K + N + 2 * (i - m), K + 2 * N - 1); }
    let ans = if (0..N).all(|i| a[i] + b[i] <= c[i]) {
        (0..N)
            .map(|i| format!("{} {} {}", a[i], b[i], c[i]))
            .collect::<Vec<_>>()
            .join("\n")
    } else { "-1".to_string() };

    println!("{}", ans);
}