Problem:
Score: 300 points

Problem Statement

In Republic of Atcoder, there are N prefectures, and a total of M cities that belong to those prefectures.

City i is established in year Y_i and belongs to Prefecture P_i.

You can assume that there are no multiple cities that are established in the same year.

It is decided to allocate a 12-digit ID number to each city.

If City i is the x-th established city among the cities that belong to Prefecture i, the first six digits of the ID number of City i is P_i, and the last six digits of the ID number is x.

Here, if P_i or x (or both) has less than six digits, zeros are added to the left until it has six digits.

Find the ID numbers for all the cities.

Note that there can be a prefecture with no cities.

Constraints

1 \leq N \leq 10^5

1 \leq M \leq 10^5

1 \leq P_i \leq N

1 \leq Y_i \leq 10^9

Y_i are all different.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N M
P_1 Y_1
:
P_M Y_M

Output

Print the ID numbers for all the cities, in ascending order of indices (City 1, City 2, ...).

Sample Input 1

2 3
1 32
2 63
1 12

Sample Output 1

000001000002
000002000001
000001000001

As City 1 is the second established city among the cities that belong to Prefecture 1, its ID number is 000001000002.

As City 2 is the first established city among the cities that belong to Prefecture 2, its ID number is 000002000001.

As City 3 is the first established city among the cities that belong to Prefecture 1, its ID number is 000001000001.

Sample Input 2

2 3
2 55
2 77
2 99

Sample Output 2

000002000001
000002000002
000002000003

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using static Atcoder;
using System.Threading.Tasks;
using System.ComponentModel;

public class Hello
{
    struct ABC113_C
    {
        public int P;
        public int Y;
    }

    public static void Main()
    {
        C();
        return;
        int[] naa = SpRead(' ').Select(i => int.Parse(i)).ToArray();
        int N = naa[0], M = naa[1];
        int[] box;
        int[] Ys = new int[M];
        int[] Ps = new int[M];
        for (int i = 0; i < M; i++)
        {
            box = SpRead(' ').Select(a => int.Parse(a)).ToArray();
            Ys[i] = box[1];
            Ps[i] = box[0];
        }
        Dictionary<Tuple<int, int>, string> ans = new Dictionary<Tuple<int, int>, string>();
        List<int> list = new List<int>();
        for (int i = 1; i <= N; i++)
        {
            list = new List<int>();
            for (int j = 0; j < M; j++)
            {
                if (Ps[j] == i) list.Add(Ys[j]);
            }
            list.Sort();
            for (int j = 0; j < list.Count(); j++)
            {
                string ansString = i.ToString().PadLeft(6, '0') + (j + 1).ToString().PadLeft(6, '0');
                ans.Add(new Tuple<int, int>(i, list[j]), ansString);
            }
        }

        for (int i = 0; i < M; i++)
        {
            Console.WriteLine(ans[new Tuple<int, int>(Ps[i], Ys[i])]);
        }


    }

    public static void C()
    {
        int[] naa = SpRead(' ').Select(i => int.Parse(i)).ToArray();
        int N = naa[0], M = naa[1];
        int[] box;
        int[] Ys = new int[M];
        int[] Ps = new int[M];

        //N個の都市
        List<int>[] listZ = new List<int>[N + 1];
        for (int i = 0; i < N; i++) listZ[i+1] = new List<int>();
        for (int i = 0; i < M; i++)
        {
            box = SpRead(' ').Select(a => int.Parse(a)).ToArray();
            Ys[i] = box[1];
            Ps[i] = box[0];
            listZ[Ps[i]].Add(Ys[i]);
        }
        
        Dictionary<Tuple<int, int>, string> ans = new Dictionary<Tuple<int, int>, string>();

        for (int i = 1; i <= N; i++)
        {
            listZ[i].Sort();
            for (int j = 0; j < listZ[i].Count(); j++)
            {
                string ansString = i.ToString().PadLeft(6, '0') + (j + 1).ToString().PadLeft(6, '0');
                ans.Add(new Tuple<int, int>(i, listZ[i][j]), ansString);
            }
        }
        for (int i = 0; i < M; i++)
        {
            Console.WriteLine(ans[new Tuple<int, int>(Ps[i], Ys[i])]);
        }

    }

}


public class Atcoder
{
    static void Swap<T>(ref T a, ref T b)
    {
        var t = a;
        a = b;
        b = t;
    }
    public static int LCM(int a, int b)
    {
        int c = a * b;
        if (a < b) Swap(ref a, ref b);
        int d = a % b;
        while (d != 0)
        {
            a = b;
            b = d;
            d = a % b;
        }
        return c / b;
    }
    public static string strReverce(string s)
    {
        return new string(s.Reverse().ToArray());
    }
    public static int intRead()
    {
        return int.Parse(Console.ReadLine());
    }
    public static bool IsPrime(int n)
    {
        if (n < 2) return false;
        if (n == 2) return true;
        if (n % 2 == 0) return false;

        //double sqrtNum = Math.Sqrt(n);
        for (int i = 3; i < n; i += 2)
        {
            if (n % i == 0) return false;
        }
        return true;
    }
    public static string[] SpRead(char c)
    {
        return Console.ReadLine().Split(c);
    }

}