Problem: An array b is called to be a subarray of a if it forms a continuous subsequence of a, that is, if it is equal to a_l, a_{l + 1}, …, a_r for some l, r.

Suppose m is some known constant. For any array, having m or more elements, let's define it's beauty as the sum of m largest elements of that array. For example: 

  * For array x = [4, 3, 1, 5, 2] and m = 3, the 3 largest elements of x are 5, 4 and 3, so the beauty of x is 5 + 4 + 3 = 12.
  * For array x = [10, 10, 10] and m = 2, the beauty of x is 10 + 10 = 20.



You are given an array a_1, a_2, …, a_n, the value of the said constant m and an integer k. Your need to split the array a into exactly k subarrays such that:

  * Each element from a belongs to exactly one subarray.
  * Each subarray has at least m elements.
  * The sum of all beauties of k subarrays is maximum possible.

Input

The first line contains three integers n, m and k (2 ≤ n ≤ 2 ⋅ 10^5, 1 ≤ m, 2 ≤ k, m ⋅ k ≤ n) — the number of elements in a, the constant m in the definition of beauty and the number of subarrays to split to.

The second line contains n integers a_1, a_2, …, a_n (-10^9 ≤ a_i ≤ 10^9).

Output

In the first line, print the maximum possible sum of the beauties of the subarrays in the optimal partition.

In the second line, print k-1 integers p_1, p_2, …, p_{k-1} (1 ≤ p_1 < p_2 < … < p_{k-1} < n) representing the partition of the array, in which:

  * All elements with indices from 1 to p_1 belong to the first subarray.
  * All elements with indices from p_1 + 1 to p_2 belong to the second subarray.
  * ….
  * All elements with indices from p_{k-1} + 1 to n belong to the last, k-th subarray.



If there are several optimal partitions, print any of them.

Examples

Input


9 2 3
5 2 5 2 4 1 1 3 2


Output


21
3 5 

Input


6 1 4
4 1 3 2 2 3


Output


12
1 3 5 

Input


2 1 2
-1000000000 1000000000


Output


0
1 

Note

In the first example, one of the optimal partitions is [5, 2, 5], [2, 4], [1, 1, 3, 2].

  * The beauty of the subarray [5, 2, 5] is 5 + 5 = 10. 
  * The beauty of the subarray [2, 4] is 2 + 4 = 6. 
  * The beauty of the subarray [1, 1, 3, 2] is 3 + 2 = 5. 



The sum of their beauties is 10 + 6 + 5 = 21.

In the second example, one optimal partition is [4], [1, 3], [2, 2], [3].

Solution (in JAVA):

Solution:
import java.util.*;
import java.io.*;
import java.math.*;
import java.math.BigInteger;
import java.text.DecimalFormat;

public class Test2 {
	public static long maxLong = Long.MAX_VALUE;
	public static int maxInt = Integer.MAX_VALUE;
	public static long minLong = Long.MIN_VALUE;
	public static int minInt = Integer.MIN_VALUE;
	public static final long MOD = (long) (1e9 + 7);
	
	
	
	public static void main(String args[])
	{
		InputReader in = new InputReader(System.in);
		OutputStream outputStream = System.out;
		PrintWriter out = new PrintWriter(outputStream);
		
		int n = in.nextInt();
		int m = in.nextInt();
		int k = in.nextInt();
		
		int [] arr = in.nextIntArray(n);
		ArrayList<Pair> list = new ArrayList<>();
		
		for(int i=0;i<arr.length;i++)
		{
			Pair p = new Pair(arr[i],i);
			list.add(p);
		}
		
		Collections.sort(list,Collections.reverseOrder());
		
		ArrayList<Long> l = new ArrayList<>();
		long ans =0;
		for(int i=0;i<m*k;i++)
		{
			ans += list.get(i).first;
			l.add(list.get(i).second);
		}
		
		Collections.sort(l);
		
		System.out.println(ans);
		
		for(int i=0;i<k-1;i++)
		{
			System.out.print(l.get((i+1) * m -1 ) +1 +" ");
		}
				
		out.close();
	}

	
	static int binarySearch(int arr[], int x, int l, int r)
    {
        while (l <= r)
        {
            int m = l + (r-l)/2;
 
            if (arr[m] == x)
                return m;
 
            if (arr[m] < x)
			{
				l = m + 1; 
			} 
            else
			{
				r = m - 1;
			}
        }
        return -1;
    }
	
	static int floorSearch(int arr[], int low, int high, int x)
	{
		int ans=-1;
		while(low<=high)
		{
			int mid=(low)+(high-low)/2;
			
			if (arr[mid] == x)
				return mid;
			else if(arr[mid]>x)
			{
				high=mid-1;
			}
			else
			{
				ans=mid;
				low=mid+1;				
			}
		}
		return ans;
	}


	static int ceilSearch(int arr[], int low, int high, int x)
    {
    	int ans=-1;
		while(low<=high)
		{
			int mid=(low)+(high-low)/2;
			
			if(arr[mid] == x)
				return mid;
			else if(arr[mid]>x)
			{
				ans=mid;
				high=mid-1;
			}
			else
			{
				low=mid+1;
			}
		}
		return ans;
    }
	
	static int gcd(int a, int b)
    {
        if (a == 0)
            return b;
        return gcd(b % a, a);
    }
	
    static int gcdArray(int arr[], int n)
    {
        int result = arr[0];
        for (int i = 1; i < n; i++)
            result = gcd(arr[i], result);
 
        return result;
    }
	
	static int lcm(int a, int b)
    {
        return (a*b)/gcd(a, b);
    }
	
	public static long ncr(long n, long r) 
	{
		long result=1;
		result = factorial(n)/(factorial(r)*factorial(n-r));
		return result;
	}
	
	public static long factorial(long n) 
	{
	   long c;
	   long result = 1;
	 
	   for (c = 1; c <= n; c++)
		  result = result*c;
	 
	   return result;
	}
	 static long modFactorial(long x)
	 {
		long i=x,mul=1;
		while(i>0)
		{
			mul=(mul%MOD)*(i%MOD)%MOD;
			i--;
		}
		return mul;
	 }
	
	public static long modPower(long base, long exp) 
	{
		long res=1;
		while(exp>0) {
		   if(exp%2==1) 
			   res=(res*base)%MOD;
		   base=(base*base)%MOD;
		   exp/=2;
		}
		return res%MOD;
	}
	
	
	static void printArray(int [] arr)
	{
		System.out.println(Arrays.toString(arr));
	}
	static void printArray(float [] arr)
	{
		System.out.println(Arrays.toString(arr));
	}
	static void printArray(double [] arr)
	{
		System.out.println(Arrays.toString(arr));
	}
	static void printArray(long [] arr)
	{
		System.out.println(Arrays.toString(arr));
	}
	static void printArray(char [] arr)
	{
		System.out.println(Arrays.toString(arr));
	}
	
	
	static void print2DArray(int [][] arr)
	{
		for(int [] a : arr)
		{
			System.out.println(Arrays.toString(a));
		}
	}
	static void print2DArray(float [][] arr)
	{
		for(float [] a : arr)
		{
			System.out.println(Arrays.toString(a));
		}
	}
	static void print2DArray(double [][] arr)
	{
		for(double [] a : arr)
		{
			System.out.println(Arrays.toString(a));
		}
	}
	static void print2DArray(long [][] arr)
	{
		for(long [] a : arr)
		{
			System.out.println(Arrays.toString(a));
		}
	}
	static void print2DArray(char [][] arr)
	{
		for(char [] a : arr)
		{
			System.out.println(Arrays.toString(a));
		}
	}
	
	static void printArrayObject(Object [] arr)
	{
		System.out.println(Arrays.toString(arr));
	}
	
	static void print2DArrayObject(Object [][] arr)
	{
		for(Object [] a : arr)
		{
			System.out.println(Arrays.toString(a));
		}
	}
	
	
	static class InputReader {
		public BufferedReader reader;
		public StringTokenizer tokenizer;

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

		public String nextLine(){
			String fullLine=null;
			while (tokenizer == null || !tokenizer.hasMoreTokens()) {
				try {
					fullLine=reader.readLine();
				} catch (IOException e) {
					throw new RuntimeException(e);
				}
				return fullLine;
			}
			return fullLine;
		}
		public String next() {
			while (tokenizer == null || !tokenizer.hasMoreTokens()) {
				try {
					tokenizer = new StringTokenizer(reader.readLine());
				} catch (IOException e) {
					throw new RuntimeException(e);
				}
			}
			return tokenizer.nextToken();
		}
		public long nextLong() {
			return Long.parseLong(next());
		}
		public int nextInt() {
			return Integer.parseInt(next());
		}
		public double nextDouble() {
			return Double.parseDouble(next());
		}
		
		public int[] nextIntArray(int n)	
		{
			int[] a=new int[n];
			for(int i=0;i<n;i++)
				a[i]=nextInt();
			return a;
		}
		public long[] nextLongArray(int n)	
		{
			long[] a=new long[n];
			for(int i=0;i<n;i++)
				a[i]=nextLong();
			return a;
		}
		public double[] nextDoubleArray(int n)	
		{
			double[] a=new double[n];
			for(int i=0;i<n;i++)
				a[i]=nextDouble();
			return a;
		}
		public String[] nextStringArray(int n)	
		{
			String[] a=new String[n];
			for(int i=0;i<n;i++)
				a[i]=next();
			return a;
		}
		
	}
	
	static class Pair implements Comparable<Pair>
	{
		long first;
		long second;
		//private long second;;

		public Pair(long i, long j) 
		{ 
			this.first = i;
			this.second = j;
		}
		public Pair() {
		}
		
		@Override
		public int compareTo(Pair o) 
		{
			return Long.compare(this.first, o.first);
		}
	}
	
	
	static class LengthComparator implements Comparator<String> {
	    public int compare(String arg0, String arg1) {
			return (arg0+arg1).compareTo(arg1+arg0);
	    }
	}
}





class Graph
{
    private int V;   
    private LinkedList<Integer> adj[];
 
    Graph(int v)
    {
        V = v;
        adj = new LinkedList[v];
        for (int i=0; i<v; ++i)
            adj[i] = new LinkedList();
    }
 
    void addEdge(int v,int w)
    {
        adj[v].add(w);
    }
	
	void addEdgeUndirected(int v, int w)
    {
        adj[v].add(w);  // Add w to v's list.
        adj[w].add(v);    //Add v to w's list
    }
 
 
    void BFS(int s)
    {
        boolean visited[] = new boolean[V];
 
        LinkedList<Integer> queue = new LinkedList<Integer>();
 
        visited[s]=true;
        queue.add(s);
 
        while (queue.size() != 0)
        {
            s = queue.poll();
            System.out.print(s+" ");

            Iterator<Integer> i = adj[s].listIterator();
            while (i.hasNext())
            {
                int n = i.next();
                if (!visited[n])
                {
                    visited[n] = true;
                    queue.add(n);
                }
            }
        }
    }
	
	
	void DFS(int s)
    {
        boolean visited[] = new boolean[V];
 
        Stack<Integer> stack = new Stack<Integer>();
 
        visited[s]=true;
        stack.push(s);
 
        while (stack.size() != 0)
        {
            s = stack.pop();
            System.out.print(s+" ");

            Iterator<Integer> i = adj[s].listIterator();
            while (i.hasNext())
            {
                int n = i.next();
                if (!visited[n])
                {
                    visited[n] = true;
                    stack.push(n);
                }
            }
        }
    }
	
	void topologicalSortUtil(int v, boolean visited[], Stack stack)
    {
        visited[v] = true;
        Integer i;
 
        Iterator<Integer> it = adj[v].iterator();
        while (it.hasNext())
        {
            i = it.next();
            if (!visited[i])
                topologicalSortUtil(i, visited, stack);
        }
        stack.push(new Integer(v));
    }
 
    void topologicalSort()
    {
        Stack stack = new Stack();
 
        boolean visited[] = new boolean[V];
        for (int i = 0; i < V; i++)
            visited[i] = false;
 
        for (int i = 0; i < V; i++)
            if (visited[i] == false)
                topologicalSortUtil(i, visited, stack);
 
        while (stack.empty()==false)
            System.out.print(stack.pop() + " ");
    }
	
	
	int time =0;
	
	void bridgeUtil(int u, boolean visited[], int disc[], int low[], int parent[])
    {
 
        int children = 0;
 
        visited[u] = true;
 
        disc[u] = low[u] = ++time;
 
        Iterator<Integer> i = adj[u].iterator();
        while (i.hasNext())
        {
            int v = i.next(); 
 
            if (!visited[v])
            {
                parent[v] = u;
                bridgeUtil(v, visited, disc, low, parent);
 
                low[u]  = Math.min(low[u], low[v]);
 
                if (low[v] > disc[u])
                    System.out.println(u+" "+v);
            }
            else if (v != parent[u])
                low[u]  = Math.min(low[u], disc[v]);
        }
    }
 
    void bridge()
    {
        boolean visited[] = new boolean[V];
        int disc[] = new int[V];
        int low[] = new int[V];
        int parent[] = new int[V];
 
 
        for (int i = 0; i < V; i++)
        {
            parent[i] = -1;
            visited[i] = false;
        }
 
        for (int i = 0; i < V; i++)
            if (visited[i] == false)
                bridgeUtil(i, visited, disc, low, parent);
    }
	
	
	void DFSUtil(int v,boolean visited[])
    {
        visited[v] = true;

        Iterator<Integer> i = adj[v].listIterator();
        while (i.hasNext())
        {
            int n = i.next();
            if (!visited[n])
                DFSUtil(n, visited);
        }
    }

    void motherVertex()
    {
        boolean visited[] = new boolean[V];
        for (int i = 0; i < V; i++)
        {
            visited[i] = false;
        }    
        
        // The vertex that finishes last should be the mother node
        int v = -1;
        for (int i = 0; i < V; i++)
        {
            if (visited[i] == false)
            {
                DFSUtil(i, visited);
                v = i;
            }
        }
        
        for (int i = 0; i < V; i++)
        {
            visited[i] = false;
        }
        
        System.out.println(" Mother Vertex Detected At:"  + v);
        
        DFSUtil(v, visited);
        for(int i = 0; i < V; i++)
        {
            if(visited[i] == false)
            {
                System.out.println("Not a mother vertex.Node that wasn't connected :" + i);        
                return;
            }
        }
        System.out.println(" Mother Vertex: "  + v);
    }
	
}