Hanh lives in a shared apartment. There are n people (including Hanh) living there, each has a private fridge. 

n fridges are secured by several steel chains. Each steel chain connects two different fridges and is protected by a digital lock. The owner of a fridge knows passcodes of all chains connected to it. A fridge can be open only if all chains connected to it are unlocked. For example, if a fridge has no chains connected to it at all, then any of n people can open it.

<image> For exampe, in the picture there are n=4 people and 5 chains. The first person knows passcodes of two chains: 1-4 and 1-2. The fridge 1 can be open by its owner (the person 1), also two people 2 and 4 (acting together) can open it.

The weights of these fridges are a_1, a_2, …, a_n. To make a steel chain connecting fridges u and v, you have to pay a_u + a_v dollars. Note that the landlord allows you to create multiple chains connecting the same pair of fridges. 

Hanh's apartment landlord asks you to create exactly m steel chains so that all fridges are private. A fridge is private if and only if, among n people living in the apartment, only the owner can open it (i.e. no other person acting alone can do it). In other words, the fridge i is not private if there exists the person j (i ≠ j) that the person j can open the fridge i.

For example, in the picture all the fridges are private. On the other hand, if there are n=2 fridges and only one chain (which connects them) then both fridges are not private (both fridges can be open not only by its owner but also by another person).

Of course, the landlord wants to minimize the total cost of all steel chains to fulfill his request. Determine whether there exists any way to make exactly m chains, and if yes, output any solution that minimizes the total cost. 

Input

Each test contains multiple test cases. The first line contains the number of test cases T (1 ≤ T ≤ 10). Then the descriptions of the test cases follow.

The first line of each test case contains two integers n, m (2 ≤ n ≤ 1000, 1 ≤ m ≤ n) — the number of people living in Hanh's apartment and the number of steel chains that the landlord requires, respectively.

The second line of each test case contains n integers a_1, a_2, …, a_n (0 ≤ a_i ≤ 10^4) — weights of all fridges.

Output

For each test case:

  * If there is no solution, print a single integer -1. 
  * Otherwise, print a single integer c — the minimum total cost. The i-th of the next m lines contains two integers u_i and v_i (1 ≤ u_i, v_i ≤ n, u_i ≠ v_i), meaning that the i-th steel chain connects fridges u_i and v_i. An arbitrary number of chains can be between a pair of fridges. 



If there are multiple answers, print any.

Example

Input


3
4 4
1 1 1 1
3 1
1 2 3
3 3
1 2 3


Output


8
1 2
4 3
3 2
4 1
-1
12
3 2
1 2
3 1
import java.io.*;
import java.math.*;
import java.util.*;

/**
 *
 * @author Saju
 *
 */

public class Main {

	private static int dx[] = { 1, 0, -1, 0};
	private static int dy[] = { 0, -1, 0, 1};

	private static final long INF = (long) (1e15);
	private static final int INT_INF = Integer.MAX_VALUE;
	private static final long NEG_INF = Long.MIN_VALUE;
	private static final double EPSILON = 1e-10;

	private static final int MAX = 1007;
	private static final long MOD = 1000000007;
	
	private static final int MAXN = 100007;
	private static final int MAXA = 10000009;
	private static final int MAXLOG = 22;

	public static void main(String[] args) {

		InputReader in = new InputReader(System.in);
		PrintWriter out = new PrintWriter(System.out);
		

/*


*/
		
		int test = in.nextInt();
		for (int t = 1; t <= test; t++) {
			int n = in.nextInt();
			int m = in.nextInt();
			
			List<Point> cost = new ArrayList<Main.Point>();
			for(int i = 1; i <= n; i++) {
				long a = in.nextLong();
				cost.add(new Point(i, a));
			}
			if(m < n) {
				System.out.println("-1");
				continue;
			}
			
			if(n == 2) {
				System.out.println("-1");
				continue;
			}
			
			Collections.sort(cost, new Comparator<Point>() {

				@Override
				public int compare(Point p1, Point p2) {
					int val = Long.compare(p1.y, p2.y);
					if(val == 0) {
						return Long.compare(p1.x, p2.x);
					}
					return val;
				}
			});
			
			long total = 0;
			StringBuilder sb = new StringBuilder();
			
			for(int i = 0; i < n; i++) {
				int j = i + 1;
				if(j == n) {
					j = 0;
				}
				Point p1 = cost.get(i);
				Point p2 = cost.get(j);
				sb.append(p1.x + " " + p2.x + "\n");
				total += (p1.y + p2.y);
			}
			
			System.out.println(total);
			System.out.println(sb.toString());
			
		}
		
	
		
		out.flush();
		out.close();
		System.exit(0);
	}
	
	

	private static int bfs(List<Integer>[] adj, int src, boolean[] visited, int[] color) {
		Queue<Integer> queue = new LinkedList<Integer>();
		queue.add(src);
		visited[src] = true;
		int blueCount = 1;
		int redCount = 0;
		
		color[src] = 1; // 1: blue, 2: red
		
		while(!queue.isEmpty()) {
			int u = queue.remove();
			for(Integer v : adj[u]) {
				if(!visited[v]) {
					visited[v] = true;
					queue.add(v);
					if(color[u] == 1) {
						redCount++;
						color[v] = 2;
					}
					else if(color[u] == 2){
						blueCount++;
						color[v] = 1;
					}
				}
			}
		}
		return max(blueCount, redCount);
	}

	private static class Graph{
		private int node;
		private List<Edge>[] adj;
		
		Graph(int node){
			this.node = node;
			adj = new ArrayList[this.node];
			for(int i = 0; i < node; i++) {
				adj[i] = new ArrayList<Main.Edge>();
			}
		}
		
		void addEdge(int u, int v, int cost) {
			Edge e = new Edge(u, v, cost);
			Edge e1 = new Edge(v, u, cost);
			adj[u].add(e);
			adj[v].add(e1);
		}
		
		int calculateShortestPath(int source) {
			int dist[][] = new int[2][node];
			for(int i = 0; i < node; i++) {
				dist[0][i] = INT_INF;
				dist[1][i] = INT_INF;
			}
			
			dist[0][source] = 0;
			PriorityQueue<Node> queue = new PriorityQueue<Main.Node>(new Comparator<Node>() {

				@Override
				public int compare(Node o1, Node o2) {
					if (o1.operation == o2.operation) {
						if(o1.distance == o2.distance) {
							return Integer.compare(o1.node, o2.node);
						}
						return Integer.compare(o1.distance, o2.distance);
					}
					return Integer.compare(o1.operation, o2.operation);
					
				}
			});
			
			queue.offer(new Node(0, source, 0));
			while(!queue.isEmpty()) {
				Node nn = queue.remove();
				int op = nn.operation;
				int u = nn.node;
				int d = nn.distance;
				
				if(u == node - 1 && op == 1) {
					return dist[1][u];
				}
				if(d > dist[op][u]) {
					continue;
				}
				
				for(Edge e : adj[u]) {
					int v = e.v;
					int w = e.cost;
					if(w + d < 	dist[0][v]) {
						dist[1][v] = dist[0][v];
						dist[0][v] = w + d;
						queue.add(new Node(1, v, dist[1][v]));
						queue.add(new Node(0, v, dist[0][v]));
					}
					else if(w + d > dist[0][v] && w + d < dist[1][v]) {
						dist[1][v] = w + d;
						queue.add(new Node(1, v, dist[1][v]));
					}
				}
			}
			return INT_INF;
			
		}
	}
	
	private static class Node{
		int operation;
		int node;
		int distance;
		Node(int operation, int node, int distance){
			this.operation = operation;
			this.node = node;
			this.distance = distance;
		}
	}
	
	private static class Edge{
		int u;
		int v;
		int cost;
		
		Edge(int u, int v, int cost){
			this.u = u;
			this.v = v;
			this.cost = cost;
		}
		
		int getNeighbourIndex(int node) {
			if(this.u == node) {
				return v;
			}
			return u;
		}
	}
	
	private static boolean isPalindrome(String str) {
		StringBuilder sb = new StringBuilder();
		sb.append(str);
		String str1 = sb.reverse().toString();
		return str.equals(str1);
 	}

	private static String reverseString(String str) {
		StringBuilder sb = new StringBuilder();
		sb.append(str);
		return sb.reverse().toString();
	}
	
	
	private static double distance(Point p1, Point p2) {
		long divx = p2.x - p1.x;
		long divy = p2.y - p1.y;
		divx = divx * divx;
		divy = divy * divy;
		return Math.sqrt(divx + divy);
	}
	
	private static String getBinaryStr(int n, int j) {
		String str = Integer.toBinaryString(n);
		int k = str.length();
		for(int i = 1; i <= j - k; i++) {
			str = "0" + str;
		}
		
		return str;
	}

	// O(log(max(A,M)))
	static long modInverse(long a, long m) {
		extendedEuclid(a, m);
		return (x % m + m) % m;
	}

	static long x;
	static long y;
	static long gcdx;

	private static void extendedEuclid(long a, long b) {
		if (b == 0) {
			gcdx = a;
			x = 1;
			y = 0;
		} else {
			extendedEuclid(b, a % b);
			long temp = x;
			x = y;
			y = temp - ((a / b) * y);
		}
	}
	
	private static void generatePrime(int n) {
		 //O(NloglogN)
		boolean arr[] = new boolean[n + 5];
		Arrays.fill(arr, true);
		for(int i = 2; i * i <=n; i++){
			if(arr[i] == true){
				for(int j = i * i; j <= n; j+=i){
					arr[j] = false; 
				}
			}
		}
		int count = 0;
		int start = 0;
		for(int i = 2; i <= n; i++){
			if(arr[i] == true){
//				System.out.println(i + " ");
				count++;
			}
			if(count == (start * 100) + 1) {
//				System.out.println(i);
				start++;
			}
		}
		System.out.println();
		System.out.println(count);
		
	}
	
	private static Map<Long, Long> primeFactorization(long n, long m){
		Map<Long, Long> map = new HashMap<>();
		
		for(long i = 2; i <= Math.sqrt(n); i++){
			if(n % i == 0){
			long count = 0;
			while(n % i == 0){
				count++;
				n = n / i;
			}
			long val = count * m;
			map.put(i, val);
//			System.out.println("i: " + i + ", count: " + count);
		}
			
		}
		if(n != 1) {
//			System.out.println(n);
			map.put(n, m);
		}
		return map;
	}

	private static class Pair<T>{
		T a;
		T b;
		Pair(T a, T b){
			this.a = a;
			this.b = b;
		}
	}
	
	private static class SegmentTree{
		int n;
		private final int MAXN = 100007;
		private long[] tree = new long[MAXN << 2];
		private long[] lazy = new long[MAXN << 2];
		private long[] arr = new long[MAXN];
		
		
		/***
		 * 
		 * arr is 1 based index.
		 * 
		 * @param arr
		 * 
		 */
		SegmentTree(int n, long[] arr){
			this.n = n;
			for(int i = 0; i < arr.length; i++) {
				this.arr[i] = arr[i];
			}
		}
		
		void build(int index, int left, int right) {
			if(left == right) {
				tree[index] = arr[left];
			}
			else {
				int mid = (left + right) / 2;
				
				build(index * 2, left, mid);
				build((index * 2) + 1, mid + 1, right);
				tree[index] = max(tree[(index * 2)], tree[(index * 2) + 1]);
			}
		}
		
		long query(int node, int left, int right, int start, int end) {
			
			if(left > end || right < start) {
				return NEG_INF;
			}
			
			if(left >= start && right <= end) {
				return tree[node];
			}
			int mid = (left + right) / 2;
			long val1 = query(2 * node, left, mid, start, end);
			long val2 = query(2 * node + 1, mid + 1, right, start, end);
			
			return max(val1, val2);
		}
		
		void update(int node, int left, int right, int idx, long val) {
			if(left == right) {
				tree[node] += val;
			}
			else {
				int mid = (left + right) / 2;
				if(idx <= mid) {
					update(2 * node, left, mid, idx, val);
				}
				else {
					update(2 * node + 1, mid + 1, right, idx, val);
				}
				tree[node] = max(tree[(2 * node) + 1], tree[(2 * node)]);
			}
		}
		
		

		 void updateRange(int node, int start, int end, int l, int r, long val)
		{
		    if(lazy[node] != 0)
		    { 
		        // This node needs to be updated
		        tree[node] =  lazy[node];    // Update it
		        if(start != end)
		        {
		            lazy[node*2] = lazy[node];                  // Mark child as lazy
		            lazy[node*2+1] = lazy[node];                // Mark child as lazy
		        }
		        lazy[node] = 0;                                  // Reset it
		    }
		    if(start > end || start > r || end < l)              // Current segment is not within range [l, r]
		        return;
		    if(start >= l && end <= r)
		    {
		        // Segment is fully within range
		        tree[node] =  val;
		        if(start != end)
		        {
		            // Not leaf node
		            lazy[node*2] = val;
		            lazy[node*2+1] = val;
		        }
		        return;
		    }
		    int mid = (start + end) / 2;
		    updateRange(node*2, start, mid, l, r, val);        // Updating left child
		    updateRange(node*2 + 1, mid + 1, end, l, r, val);   // Updating right child
		    tree[node] = max(tree[node*2], tree[node*2+1]);        // Updating root with max value 
		}

		 long queryRange(int node, int start, int end, int l, int r)
		{
		    if(start > end || start > r || end < l)
		        return 0;         // Out of range
		    if(lazy[node] != 0)
		    {
		        // This node needs to be updated
		        tree[node] =  lazy[node];            // Update it
		        if(start != end)
		        {
		            lazy[node*2] = lazy[node];         // Mark child as lazy
		            lazy[node*2+1] = lazy[node];    // Mark child as lazy
		        }
		        lazy[node] = 0;                 // Reset it
		    }
		    if(start >= l && end <= r)             // Current segment is totally within range [l, r]
		        return tree[node];
		    int mid = (start + end) / 2;
		    long p1 = queryRange(node*2, start, mid, l, r);         // Query left child
		    long p2 = queryRange(node*2 + 1, mid + 1, end, l, r); // Query right child
		    return max(p1, p2);
		}
		
		 void buildRange(int node, int low, int high){
			if(low == high){
				tree[node] =  arr[low];
				return;
			}
			
			int mid = (low + high) / 2;
			int left = node << 1;
			int right = left | 1;
			buildRange(left, low, mid);
			buildRange(right, mid + 1, high);
			tree[node] = max(tree[left], tree[right]);
		}
		
		
		void printSegmentTree() {
			System.out.println(Arrays.toString(tree));
		}
		
	}
	
	private static class KMP{
		
		private static char[] t;
		private static char[] s;
		
		public int kmp(char[]t, char[]s) {
			this.t = t;
			this.s = s;
			return this.kmp();
		}
		
		private int kmp() {
			
			List<Integer> prefixTable = getPrefixTable(s);
			
			int match = 0;
			int i = 0;
			int j = 0;
			
			int n = t.length;
			int m = s.length;
			while(i < n) {
				if(t[i] == s[j]) {
					if(j == m - 1) {
						match++;
						j = prefixTable.get(j - 1);
						continue;
					}
					i++;
					j++;
				}
				else if(j > 0) {
					j = prefixTable.get(j - 1);
				}
				else {
					i++;
				}
			}
			
			return match;
		}

		/***
		1. We compute the prefix values π[i] in a loop by iterating 	<br/>
				from i=1 to i=n−1 (π[0] just gets assigned with 0).		<br/><br/>
		2. To calculate the current value π[i] we set the variable j 	<br/>
				denoting the length of the best suffix for i−1. Initially j=π[i−1].	<br/>
		3. Test if the suffix of length j+1 is also a prefix by		 <br/><br/>
				comparing s[j] and s[i]. If they are equal then we assign π[i]=j+1, 	<br/>
				otherwise we reduce j to π[j−1] and repeat this step.		<br/><br/>
		4. If we have reached the length j=0 and still don't have a match,	<br/> 
				then we assign π[i]=0 and go to the next index i+1.		<br/><br/>
				
		@param
	 	pattern(String)
	***/
		private List<Integer> getPrefixTable(char[] pattern){
			
			List<Integer> prefixTable = new ArrayList<Integer>();
			int n = pattern.length;
			for(int i = 0; i < n; i++) {
				prefixTable.add(0);
			}
			
			for(int i = 1; i < n; i++) {
				for(int j = prefixTable.get(i - 1); j >= 0;) {
					if(pattern[j] == pattern[i]) {
						prefixTable.set(i, j + 1);
						break;
					}
					else if(j > 0){
						j = prefixTable.get(j - 1);
					}
					else {
						break;
					}
				}
			}
			
			return prefixTable;
		}
	}
	


	private static class Point {
		long x;
		long y;
		Point(long x, long y){
			this.x = x;
			this.y = y;
		}
		
		@Override
		public boolean equals(Object obj) {
			Point ob = (Point) obj;
			if(this.x == ob.x && this.y == ob.y){
				return true;
			}
			return false;
			
		}
		@Override
		public String toString() {
			return this.x + " " + this.y;
		}
		
		@Override
		public int hashCode() {
		    return 0;
		}
	}

	private static long pow(int base, int pow) {
		long val = 1L;
		for(int i = 1; i <= pow; i++) {
			val *= base;
		}
		return val;
	}
	
	private static int log(int x, int base) {
		return (int) (Math.log(x) / Math.log(base));
	}
	private static int log(long x, int base) {
		return (int) (Math.log(x) / Math.log(base));
	}
	private static long max(long a, long b) {
		if (a >= b) {
			return a;
		}
		return b;
	}

	private static long abs(long a) {
		if (a < 0) {
			return -a;
		}
		return a;
	}

	private static int abs(int a) {
		if (a < 0) {
			return -a;
		}
		return a;
	}

	private static int max(int a, int b) {
		if (a >= b) {
			return a;
		}
		return b;
	}

	private static int min(int a, int b) {
		if (a <= b) {
			return a;
		}
		return b;
	}
	
	private static long min(long a, long b) {
		if (a <= b) {
			return a;
		}
		return b;
	}

	private static long gcd(long a, long b) {
		if (b == 0) {
			return a;
		}
		return gcd(b, a % b);
	}

	private static int gcd(int a, int b) {
		if (b == 0) {
			return a;
		}
		return gcd(b, a % b);
	}

	private static long bigMod(long n, long k, long m) {

		long ans = 1;
		while (k > 0) {
			if ((k & 1) == 1) {
				ans = (ans * n) % m;
			}
			n = (n * n) % m;
			k >>= 1;
		}
		return ans;
	}

	/*
	 * Returns an iterator pointing to the first element in the range [first,
	 * last] which does not compare less than val.
	 * 
	 */
	private static int lowerBoundNew(long[] arr, long num) {
		int start = 0;
		int end = arr.length - 1;
		int index = 0;
		int len = arr.length;
		int mid = 0;
		while (true) {
			if (start > end) {
				break;
			}
			mid = (start + end) / 2;
			if (arr[mid] > num) {
				end = mid - 1;
			} else if (arr[mid] < num) {
				start = mid + 1;
			} else {
				while (mid >= 0 && arr[mid] == num) {
					mid--;
				}
				return mid + 1;
			}
		}
		if (arr[mid] < num) {
			return mid + 1;
		}
		return mid;
	}

	/*
	 * upper_bound() is a standard library function in C++ defined in the header
	 * . It returns an iterator pointing to the first element in the range
	 * [first, last) that is greater than value, or last if no such element is
	 * found
	 * 
	 */
	private static int upperBoundNew(Integer[] arr, long num) {

		int start = 0;
		int end = arr.length - 1;
		int index = 0;
		int len = arr.length;
		int mid = 0;
		while (true) {
			if (start > end) {
				break;
			}
			mid = (start + end) / 2;
			if (arr[mid] > num) {
				end = mid - 1;
			} else if (arr[mid] < num) {
				start = mid + 1;
			} else {
				while (mid < len && arr[mid] == num) {
					mid++;
				}
				if (mid == len - 1 && arr[mid] == num) {
					return mid + 1;
				} else {
					return mid;
				}
			}
		}
		if (arr[mid] < num) {
			return mid + 1;
		}
		return mid;
	}

	private static class InputReader {
		public BufferedReader reader;
		public StringTokenizer tokenizer;

		public InputReader(InputStream stream) {
			reader = new BufferedReader(new InputStreamReader(stream));
			tokenizer = null;
		}

		public String next() {
			try {
				while (tokenizer == null || !tokenizer.hasMoreTokens()) {
					tokenizer = new StringTokenizer(reader.readLine());

				}
			} catch (IOException e) {
				return null;
			}
			return tokenizer.nextToken();
		}

		public String nextLine() {
			String line = null;
			try {
				tokenizer = null;
				line = reader.readLine();
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
			return line;
		}

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

		public double nextDouble() {
			return Double.parseDouble(next());
		}

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

		public boolean hasNext() {
			try {
				while (tokenizer == null || !tokenizer.hasMoreTokens()) {
					tokenizer = new StringTokenizer(reader.readLine());
				}
			} catch (Exception e) {
				return false;
			}
			return true;
		}
	}
}
 			 	 	   			  	  	 				   			