The numbers 1,   2,   ...,   n ⋅ k are colored with n colors. These colors are indexed by 1,   2,   ...,   n. For each 1 ≤ i ≤ n, there are exactly k numbers colored with color i.

Let [a,   b] denote the interval of integers between a and b inclusive, that is, the set \\{a,   a + 1,   ...,   b\}. You must choose n intervals [a_1,   b_1],   [a_2,   b_2],   ..., [a_n,   b_n] such that: 

  * for each 1 ≤ i ≤ n, it holds 1 ≤ a_i < b_i ≤ n ⋅ k; 
  * for each 1 ≤ i ≤ n, the numbers a_i and b_i are colored with color i; 
  * each number 1 ≤ x ≤ n ⋅ k belongs to at most \left⌈ (n)/(k - 1) \right⌉ intervals. 



One can show that such a family of intervals always exists under the given constraints.

Input

The first line contains two integers n and k (1 ≤ n ≤ 100, 2 ≤ k ≤ 100) — the number of colors and the number of occurrences of each color.

The second line contains n ⋅ k integers c_1,   c_2,   ...,   c_{nk} (1 ≤ c_j ≤ n), where c_j is the color of number j. It is guaranteed that, for each 1 ≤ i ≤ n, it holds c_j = i for exactly k distinct indices j.

Output

Output n lines. The i-th line should contain the two integers a_i and b_i.

If there are multiple valid choices of the intervals, output any.

Examples

Input


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


Output


4 5
1 7
8 11
6 12

Input


1 2
1 1


Output


1 2


Input


3 3
3 1 2 3 2 1 2 1 3


Output


6 8
3 7
1 4

Input


2 3
2 1 1 1 2 2


Output


2 3
5 6

Note

In the first sample, each number can be contained in at most \left⌈ (4)/(3 - 1) \right⌉ = 2 intervals. The output is described by the following picture:

<image>

In the second sample, the only interval to be chosen is forced to be [1,   2], and each number is indeed contained in at most \left⌈ (1)/(2 - 1) \right⌉ = 1 interval.

In the third sample, each number can be contained in at most \left⌈ (3)/(3 - 1) \right⌉ = 2 intervals. The output is described by the following picture:

<image>
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.List;
 import java.util.*;
 public class realfast implements Runnable 
  {
    private static final int INF = (int) 1e9;
    long in= 1000000007;
    long fac[]= new long[1000001];
    long inv[]=new long[1000001];
    public  void solve() throws IOException 
    {

        
         

        int n = readInt();
        int k = readInt();
        int arr[]=new int[n*k+1];

        for(int i=1;i<=(n*k);i++)
          arr[i]= readInt();
        int map1[]=new int[n+1];
        Arrays.fill(map1,n*k+100);
        int next[]=new int[n*k+1];
        int s[]=new int[n+1];
        int e[]=new int[n+1];
        for(int i=n*k;i>=1;i--)
        {
              next[i]= map1[arr[i]];
              e[arr[i]]= next[i];
              s[arr[i]]=i;
              map1[arr[i]]=i;
        }
        int ans[][]=new int[n+1][2];
        int pal[]=new int[n+1];
        int g = (n+k-2)/(k-1);
       // out.println(g);
        boolean map[]=new boolean[n+1];
        for(int j=1;j<=n;j++)
        {
          int min = n*k+100;
          int cur=0;
          for(int i=1;i<=n;i++)
          {
            if(!map[i])
            {
               if(e[i]<min)
               {
                   min=e[i];
                   cur=i;
               }
            }
          }
          ans[cur][0]=s[cur];
          ans[cur][1]=e[cur];
          map[cur]= true;
          for(int i=1;i<=n;i++)
          {
             if(!map[i])
             {
              if(e[i]<s[cur]||e[cur]<s[i])
              {
                
              }
              else{
                pal[i]++;
               if(pal[i]==g)
               {
                pal[i]=0;
                s[i]=e[i];
                e[i]= next[e[i]];
                }
              }
             }

          }        
        }

        for(int i=1;i<=n;i++)
        {
          out.println(s[i]+" "+e[i]);
        }



    }
    public boolean check(int arr[] , int i , int val, int n)
    {
        if(i==n)
        {
            if(Math.abs(val)==Math.abs(arr[n]))
                return true;
            else
                return false;
        }
        if(check(arr,i+1,val+arr[i],n)||check(arr,i+1,val-arr[i],n)||check(arr,i+1,val,n))
        {
            return true;
        }
        else
            return false;
    }
    
    public int value (int seg[], int left , int right ,int index, int l, int r)
    {
            
            if(left>right)
            {
              return -100000000;
            }
            if(right<l||left>r)
                return -100000000;
            if(left>=l&&right<=r)
                return seg[index];
            int mid = left+(right-left)/2;
            int val = value(seg,left,mid,2*index+1,l,r);
            int val2 = value(seg,mid+1,right,2*index+2,l,r);
            return Math.max(val,val2);

    }
   
    public int gcd(int a , int b )
    {
      if(a<b)
      {
        int t =a;
        a=b;
        b=t;
      }
      if(a%b==0)
        return b ;
      return gcd(b,a%b);
    }
    public long pow(long n , long p,long m)
    {
         if(p==0)
            return 1;
        long val = pow(n,p/2,m);;
        val= (val*val)%m;
        if(p%2==0)
            return val;
        else
            return (val*n)%m;
    }
    
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    public static void main(String[] args) {
        new Thread(null, new realfast(), "", 128 * (1L << 20)).start();
    }
 
    private static final boolean ONLINE_JUDGE = System.getProperty("ONLINE_JUDGE") != null;
    private BufferedReader reader;
    private StringTokenizer tokenizer;
    private PrintWriter out;
 
    @Override
    public void run() {
        try {
            if (ONLINE_JUDGE || !new File("input.txt").exists()) {
                reader = new BufferedReader(new InputStreamReader(System.in));
                out = new PrintWriter(System.out);
            } else {
                reader = new BufferedReader(new FileReader("input.txt"));
                out = new PrintWriter("output.txt");
            }
            solve();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                reader.close();
            } catch (IOException e) {
                // nothing
            }
            out.close();
        }
    }
 
    private String readString() throws IOException {
        while (tokenizer == null || !tokenizer.hasMoreTokens()) {
            tokenizer = new StringTokenizer(reader.readLine());
        }
        return tokenizer.nextToken();
    }
 
    @SuppressWarnings("unused")
    private int readInt() throws IOException {
        return Integer.parseInt(readString());
    }
 
    @SuppressWarnings("unused")
    private long readLong() throws IOException {
        return Long.parseLong(readString());
    }
 
    @SuppressWarnings("unused")
    private double readDouble() throws IOException {
        return Double.parseDouble(readString());
    }
}
class edge implements Comparable<edge>{
    long u ;
    long v;
    
    edge(long u, long v)
    {
       this.u=u;
       this.v=v;
    }
    public int compareTo(edge e)
    {
        if(this.v>=e.v)
        return 1;
        else
        return -1;

    }
}