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.lang.*;
public  class c2 
{

	
	public static long mod = (int)Math.pow(10, 9) + 7;
    
	
    public static void main(String[] args)
    {
        InputReader in = new InputReader(System.in);
        PrintWriter pw = new PrintWriter(System.out);

        // Code starts..

       
        int n = in.nextInt();
        int m = in.nextInt();
        int k = in.nextInt();
        int[] a = new int[n];
        int[] b = new int[n];
        for(int i=0; i<n; i++)
        {
        	a[i] = in.nextInt();
        	b[i] = -a[i];
        	
        }
        
        
        
        Arrays.sort(b);
        HashSet<Integer> set = new HashSet<>();
        for(int i=0; i<m*k; i++)
        	set.add(-b[i]);

        
        long sum = 0;
        ArrayList<Integer> ans = new ArrayList<>();
        int cnt = 0;
        PriorityQueue<Integer> que = new PriorityQueue<>();
       // pw.println(set);
        HashSet<Integer> s2 = new HashSet<>();
        
       /* for(int i=0; i<n; i++)
        {
        	
        	if(ans.size()==k)
        		break;
        	//que.add(-a[i]);
        	if(set.contains(a[i]))
        	{
        		cnt++;
        	
        	if(cnt==m)
        	{
        		//pw.println(que);
        		ans.add(i+1);
        		cnt = 0;
        		s2.add(i+1);
        		for(int j=0; j<m; j++)
        			sum += -que.poll();
        		
        		//que.clear();
        	}
        	
        	}
        }*/
        
        /*for(int i=1; i<=n; i++)
        {
        	
        	if(set.contains(i))
        	{
        		pw.println(que);
        		for(int j=0; j<m; j++)
        			sum += -que.poll();
        		que.clear();
        	}
        	que.add(-a[i-1]);
        	
        }*/
       sum = 0;
        
        pair[] p=new pair[n];
		for(int i=0;i<n;i++) {
			p[i]=new pair(i,a[i]);
		}
		
		boolean[] max=new boolean[n];
		Arrays.sort(p);
		for(int i=0;i<m*k;i++) {
			max[(int)(long)p[i].x]=true;
			sum +=(long)p[i].y;
		}
		
		
		pw.println(sum);
		int ct=0,print=0;
		for(int i=0;i<n && print<k-1;i++) {
			if(max[i])
				ct++;
			if(ct==m) {
				pw.print((i+1)+" ");
				print++;
				ct=0;
			}
		}
        
		
		
		
        pw.flush();
        pw.close();
    }
    
    
    
    public static long pow(long x, long n, long M) {
        long result = 1;
        while (n > 0) {
            if (n % 2 == 1)
                result = (result * x) % M;
            x = (x * x) % M;
            n = n / 2;
        }
        return result;
    }
    
    
    
   
    

    public static long getFloor(long[] a, long x)
	{
		int left = 0, right = a.length - 1;

		long floor = -1;
		long fi = -1;
		while (left <= right)
		{
			int mid = (left + right) / 2;

			if (a[mid] - x == 0) {
				return mid;
			}

			else if (x - a[mid] < 0) {
				right = mid - 1;
			}
			else {
				floor = a[mid];
				fi = mid;
				left = mid + 1;
			}
		}

		return fi;
	}
    
    
    
    public static void factSieve(int[] fact, long n)
    {

        for (int i = 2; i <= n; i += 2)
            fact[i] = 2;

        for (int i = 3; i <= n; i += 2) {
            if (fact[i] == 0) {
                fact[i] = i;

                for (int j = i; (long) j * i <= n; j++) {
                    fact[(int) ((long) i * j)] = i;
                }
            }
        }

        /*
         * int k = 1000; while(k!=1) { System.out.print(a[k]+" "); k /= a[k];
         * 
         * }
         */
    }

    
    public static int gcd(int p2, int p22)
    {
        if (p2 == 0)
            return (int) p22;
        return gcd(p22 % p2, p2);
    }

    public static void nextGreater(long[] a, int[] ans)
    {

        Stack<Integer> stk = new Stack<>();
        stk.push(0);

        for (int i = 1; i < a.length; i++) {

            if (!stk.isEmpty()) {
                int s = stk.pop();
                while (a[s] < a[i]) {
                    ans[s] = i;
                    if (!stk.isEmpty())
                        s = stk.pop();
                    else
                        break;
                }
                if (a[s] >= a[i])
                    stk.push(s);
            }

            stk.push(i);

        }
        return;

    }

    public static void nextGreaterRev(long[] a, int[] ans)
    {

        int n = a.length;
        int[] pans = new int[n];
        Arrays.fill(pans, -1);
        long[] arev = new long[n];
        for (int i = 0; i < n; i++)
            arev[i] = a[n - 1 - i];

        Stack<Integer> stk = new Stack<>();
        stk.push(0);

        for (int i = 1; i < n; i++) 
        {

            if (!stk.isEmpty()) {
                int s = stk.pop();
                while (arev[s] < arev[i]) {
                    pans[s] = n - i - 1;
                    if (!stk.isEmpty())
                        s = stk.pop();
                    else
                        break;
                }
                if (arev[s] >= arev[i])
                    stk.push(s);
            }

            stk.push(i);

        }

        // for(int i=0; i<n; i++)
        // System.out.print(pans[i]+" ");

        for (int i = 0; i < n; i++)
            ans[i] = pans[n - i - 1];

        return;

    }

    public static void nextSmaller(long[] a, int[] ans)
    {

        Stack<Integer> stk = new Stack<>();
        stk.push(0);

        for (int i = 1; i < a.length; i++) {

            if (!stk.isEmpty()) {
                int s = stk.pop();
                while (a[s] > a[i]) {
                    ans[s] = i;
                    if (!stk.isEmpty())
                        s = stk.pop();
                    else
                        break;
                }
                if (a[s] <= a[i])
                    stk.push(s);
            }

            stk.push(i);

        }
        return;

    }

    public static long lcm(int[] numbers) 
    {
        long lcm = 1;
        int divisor = 2;
        while (true) {
            int cnt = 0;
            boolean divisible = false;
            for (int i = 0; i < numbers.length; i++) {
                if (numbers[i] == 0) {
                    return 0;
                } else if (numbers[i] < 0) {
                    numbers[i] = numbers[i] * (-1);
                }
                if (numbers[i] == 1) {
                    cnt++;
                }
                if (numbers[i] % divisor == 0) {
                    divisible = true;
                    numbers[i] = numbers[i] / divisor;
                }
            }
            if (divisible) {
                lcm = lcm * divisor;
            } else {
                divisor++;
            }
            if (cnt == numbers.length) {
                return lcm;
            }
        }
    }

    public static long fact(long n)
    {

        long factorial = 1;
        for (int i = 1; i <= n; i++) {
            factorial *= i;
        }
        return factorial;
    }


    public static long choose(long total, long choose)
    {
        if (total < choose)
            return 0;
        if (choose == 0 || choose == total)
            return 1;
        return (choose(total - 1, choose - 1) + choose(total - 1, choose)) % mod;
    }

    public static int[] suffle(int[] a, Random gen)
    {
        int n = a.length;
        for (int i = 0; i < n; i++) {
            int ind = gen.nextInt(n - i) + i;
            int temp = a[ind];
            a[ind] = a[i];
            a[i] = temp;
        }
        return a;
    }

    public static int[] sufflesort(int[] a) 
    {
        int n = a.length;
        Random gen = new Random();
        for (int i = 0; i < n; i++) {
            int ind = gen.nextInt(n - i) + i;
            int temp = a[ind];
            a[ind] = a[i];
            a[i] = temp;
        }
        Arrays.sort(a);
        return a;
    }
    
    
    
    
    public static int floorSearch(int arr[], int low, int high, int x) 
    {
        if (low > high)
            return -1;

        if (x > arr[high])
            return high;
        int mid = (low + high) / 2;

        if (mid > 0 && arr[mid - 1] < x && x < arr[mid])
            return mid - 1;

        if (x < arr[mid])
            return floorSearch(arr, low, mid - 1, x);

        return floorSearch(arr, mid + 1, high, x);
    }

    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    }

    public static ArrayList<Integer> primeFactorization(int n)
    {
        ArrayList<Integer> a = new ArrayList<Integer>();
        for (int i = 2; i * i <= n; i++) {
            while (n % i == 0) {
                a.add(i);
                n /= i;
            }
        }
        if (n != 1)
            a.add(n);
        return a;
    }
    
    
    

    public static void sieve(boolean[] isPrime, int n) 
    {
        for (int i = 1; i < n; i++)
            isPrime[i] = true;

        isPrime[0] = false;
        isPrime[1] = false;

        for (int i = 2; i * i < n; i++) {
            if (isPrime[i] == true) {
                for (int j = (2 * i); j < n; j += i)
                    isPrime[j] = false;
            }
        }
    }

   /* public static int lowerbound(long[] a, long c2) 
    {
        int i = Collections.binarySearch(a, c2);
        if (i < 0)
            i = -(i + 2);
        return i;

    }*/
    
/*    public static int lowerboundArray(long[] a, long c2) 
    {
        int i = Arrays.flo(a, c2);
        
        
        if (i < 0)
            i = -(i + 2);
        return i;

    }*/

    public static int uperbound(ArrayList<Integer> list, int c2) 
    {
        int i = Collections.binarySearch(list, c2);
        if (i < 0)
            i = -(i + 1);
        return i;

    }

    public static int uperboundArray(long[] a, long l)
    {
        int i = Arrays.binarySearch(a, l);
        if (i < 0)
            i = -(i + 1);
        return i;

    }

    
    public static int GCD(int a, int b)
    {
        if (b == 0)
            return a;
        else
            return GCD(b, a % b);
    }

    public static long GCD(long a, long b) 
    {
        if (b == 0)
            return a;
        else
            return GCD(b, a % b);
    }

    public static int d1;
    public static int p1;
    public static int q1;
    
    public static void extendedEuclid(int A, int B)
    {
        if (B == 0) {
            d1 = A;
            p1 = 1;
            q1 = 0;
        } else {
            extendedEuclid(B, A % B);
            int temp = p1;
            p1 = q1;
            q1 = temp - (A / B) * q1;
        }
    }

    public static long LCM(long a, long b) {
        return (a * b) / GCD(a, b);
    }

    public static int LCM(int a, int b) {
        return (a * b) / GCD(a, b);
    }

    public static int binaryExponentiation(int x, int n) {
        int result = 1;
        while (n > 0) {
            if (n % 2 == 1)
                result = result * x;
            x = x * x;
            n = n / 2;
        }
        return result;
    }

    public static int[] countDer(int n) {
        int der[] = new int[n + 1];

        der[0] = 1;
        der[1] = 0;
        der[2] = 1;

        for (int i = 3; i <= n; ++i)
            der[i] = (i - 1) * (der[i - 1] + der[i - 2]);

        // Return result for n
        return der;
    }

    static long binomialCoeff(int n, int k) {
        long C[][] = new long[n + 1][k + 1];
        int i, j;

        // Calculate value of Binomial Coefficient in bottom up manner
        for (i = 0; i <= n; i++) {
            for (j = 0; j <= Math.min(i, k); j++) {
                // Base Cases
                if (j == 0 || j == i)
                    C[i][j] = 1;

                // Calculate value using previosly stored values
                else
                    C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
            }
        }

        return C[n][k];
    }

    public static long binaryExponentiation(long x, long n) {
        long result = 1;
        while (n > 0) {
            if (n % 2 == 1)
                result = result * x;
            x = (x % mod * x % mod) % mod;
            n = n / 2;
        }
        return result;
    }

    public static int modularExponentiation(int x, int n, int M) {
        int result = 1;
        while (n > 0) {
            if (n % 2 == 1)
                result = (result * x) % M;
            x = (x * x) % M;
            n = n / 2;
        }
        return result;
    }

    public static long modularExponentiation(long x, long n, long M) {
        long result = 1;
        while (n > 0) {
            if (n % 2 == 1)
                result = (result * x) % M;
            x = (x * x) % M;
            n = n / 2;
        }
        return result;
    }

    public static long modInverse(long q, long M) {
        return modularExponentiation(q, M - 2, M);
    }

    public static long sie(long A, long M) {
        return modularExponentiation(A, M - 2, M);
    }

    public static boolean isPrime(int n) {

        if (n <= 1)
            return false;
        if (n <= 3)
            return true;

        if (n % 2 == 0 || n % 3 == 0)
            return false;

        for (int i = 5; i * i <= n; i = i + 6) {
            if (n % i == 0 || n % (i + 2) == 0)
                return false;
        }

        return true;
    }

    static class pair implements Comparable<pair>

    {
        Long x, y;

        pair(long x, long y) {
            this.x = x;
            this.y = y;
        }

        public int compareTo(pair o) {
        	int result = -y.compareTo(o.y);
            if (result == 0)
            	result = x.compareTo(o.x);

            return result;
        }

        public String toString() {
            return x + " " + y;
        }

        public boolean equals(Object o) {
            if (o instanceof pair) {
                pair p = (pair) o;
                return p.x == x && p.y == y;
            }
            return false;
        }

        public int hashCode() {
            return new Long(x).hashCode() * 31 + new Long(y).hashCode();
        }

    }

    static class triplet implements Comparable<triplet> {
        Long x, y, z;

        triplet(long x, long y, long z) {
            this.x = x;
            this.y = y;
            this.z = z;
        }

        public int compareTo(triplet o) {
            int result = x.compareTo(o.x);
            if (result == 0)
                result = y.compareTo(o.y);
            if (result == 0)
                result = z.compareTo(o.z);

            return result;
        }

        public boolean equlas(Object o) {
            if (o instanceof triplet) {
                triplet p = (triplet) o;
                return x == p.x && y == p.y && z == p.z;
            }
            return false;
        }

        public String toString() {
            return x + " " + y + " " + z;
        }

        public int hashCode() {
            return new Long(x).hashCode() * 31 + new Long(y).hashCode() + new Long(z).hashCode();
        }
    }

    
    
    
    
    
    /*
     * static class node implements Comparable<node>
     * 
     * { Integer x, y, z; node(int x,int y, int z) { this.x=x; this.y=y; this.z=z; }
     * 
     * public int compareTo(pair o) { int result = x.compareTo(o.x); if(result==0)
     * result = y.compareTo(o.y); if(result==0) result = z.compareTo(z); return
     * result; }
     * 
     * @Override public int compareTo(node o) { // TODO Auto-generated method stub
     * return 0; } }
     */



    static class InputReader 
	{
		 
		private final InputStream stream;
		private final byte[] buf = new byte[8192];
		private int curChar, snumChars;
		private SpaceCharFilter filter;
 
		public InputReader(InputStream stream) 
		{
			this.stream = stream;
		}
 
		public int snext() 
		{
			if (snumChars == -1)
				throw new InputMismatchException();
			if (curChar >= snumChars) 
			{
				curChar = 0;
				try 
				{
					snumChars = stream.read(buf);
				} 
				catch (IOException e) 
				{
					throw new InputMismatchException();
				}
				if (snumChars <= 0)
					return -1;
			}
			return buf[curChar++];
		}
 
		public int nextInt() 
	    {
			int c = snext();
			while (isSpaceChar(c)) 
			{
				c = snext();
			}
			int sgn = 1;
			if (c == '-')
		    {
				sgn = -1;
				c = snext();
			}
			int res = 0;
			do 
			{
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = snext();
			} while (!isSpaceChar(c));
			return res * sgn;
		}
 
		public long nextLong()
	    {
			int c = snext();
			while (isSpaceChar(c)) 
			{
				c = snext();
			}
			int sgn = 1;
			if (c == '-') 
			{
				sgn = -1;
				c = snext();
			}
			long res = 0;
			do 
			{
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = snext();
			} while (!isSpaceChar(c));
			return res * sgn;
		}
 
		public int[] nextIntArray(int n) 
		{
			int a[] = new int[n];
			for (int i = 0; i < n; i++) 
			{
				a[i] = nextInt();
			}
			return a;
		}
 
		public String readString()
	    {
			int c = snext();
			while (isSpaceChar(c)) 
			{
				c = snext();
			}
			StringBuilder res = new StringBuilder();
			do 
			{
				res.appendCodePoint(c);
				c = snext();
			} while (!isSpaceChar(c));
			return res.toString();
		}
 
		public String nextLine() 
		{
			int c = snext();
			while (isSpaceChar(c))
				c = snext();
			StringBuilder res = new StringBuilder();
			do 
			{
				res.appendCodePoint(c);
				c = snext();
			} while (!isEndOfLine(c));
			return res.toString();
		}
 
		public boolean isSpaceChar(int c) 
		{
			if (filter != null)
				return filter.isSpaceChar(c);
			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
		}
 
		private boolean isEndOfLine(int c) 
		{
			return c == '\n' || c == '\r' || c == -1;
		}
 
		public interface SpaceCharFilter
	    {
			public boolean isSpaceChar(int ch);
		}
	}
	
	



}