use std::cmp::min;
use std::io::{self, BufRead, Write};
fn main() {
let stdin = io::stdin();
let mut reader = stdin.lock().lines();
let mut input = String::new();
while let Some(line) = reader.next() {
match line {
Ok(l) => input.push_str(&l),
Err(_) => break,
}
}
let mut tokens = input.split_whitespace();
let cas: usize = tokens.next().unwrap().parse().unwrap();
let stdout = io::stdout();
let mut writer = io::BufWriter::new(stdout.lock());
for _ in 0..cas {
let n: usize = tokens.next().unwrap().parse().unwrap();
let k: usize = tokens.next().unwrap().parse().unwrap();
let mut c = vec![0i32; k];
let mut tp: i32 = -1;
let mut op: i32 = -1;
let mut cc = [0usize, 0usize];
for i in 0..k {
c[i] = tokens.next().unwrap().parse().unwrap();
if c[i] >= 2 {
tp = i as i32;
} else {
cc[c[i] as usize] += 1;
if c[i] == 1 {
op = i as i32;
}
}
}
if tp != -1 {
writeln!(writer, "{}", n - 1).unwrap();
for i in 1..n {
writeln!(writer, "1 {} {}", i + 1, tp + 1).unwrap();
}
continue;
}
let mut t: usize = 0;
let mut sp: usize = 1;
let mut psp: usize = 1;
while t * (k - 1) + (sp - 1) * cc[1] < n - 1 {
while t == sp * (sp - 1) / 2 {
sp += 1;
}
psp = sp;
t += 1;
}
let mut rq: usize = t * (k - 1) + (sp - 1) * cc[1] - (n - 1);
if cc[1] == 0 {
sp = 1;
}
let mut q = vec![Vec::new(); sp * (sp - 1) / 2 + 1];
let mut rs = Vec::new();
for i in 0..k {
let mut qc = t;
if c[i] > 0 {
qc += sp - 1;
}
let mut rd = min(rq, min(1 + if psp != sp && c[i] == 1 { 1 } else { 0 }, qc));
if op == i as i32 {
rd = 0;
}
qc -= rd;
rq -= rd;
let start = if c[i] > 0 { 0 } else { sp - 1 };
for j in start..(sp * (sp - 1) / 2) {
if qc == 0 {
break;
}
q[j].push(i);
qc -= 1;
}
rs.push((qc, i));
}
rs.sort();
assert!((rs.last().unwrap().0 as isize - rs.first().unwrap().0 as isize).abs() <= 1);
let mut ans = Vec::new();
let mut ind = sp;
let mut id = 0;
for i in 0..sp {
for j in (i + 1)..sp {
if q[id].is_empty() {
continue;
}
let x = q[id].pop().unwrap();
let mut lst = i;
for &y in &q[id] {
ans.push((lst, ind, y));
lst = ind;
ind += 1;
}
ans.push((lst, j, x));
id += 1;
}
}
while rs.last().unwrap().0 > 0 {
let mut fst: i32 = -1;
let mut lst: usize = 0;
for (cn, x) in &mut rs {
if *cn > 0 {
*cn -= 1;
if fst == -1 {
fst = *x;
} else {
ans.push((lst, ind, *x));
lst = ind;
ind += 1;
}
}
}
ans.push((lst, 0, fst));
}
assert!(ans.len() == n - 1 + t);
writeln!(writer, "{}", ans.len()).unwrap();
for (x, y, v) in ans {
writeln!(writer, "{} {} {}", x + 1, y + 1, v + 1).unwrap();
}
}
}