#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define NAME_LEN 11 // name に入る文字長の最大 + 1('\0')
// ノードを表す構造体
struct Node{
    char name[NAME_LEN];
    int data;
    struct Node *next;
};

typedef struct Node Node;
Node *create_node(const char *new_name, int new_data);
void clear_list(Node *head);
int pop_front(Node **head_pointer, Node **tail_pointer);
void push_back(Node **head_pointer, Node **tail_pointer, char *new_name, int new_data);
void print_list(const Node *head);


int main(void){
    Node *head = NULL;
    Node *tail = NULL; // tail -> next = NULL
    int n, q, time;
    char name[NAME_LEN];
    scanf("%d %d", &n, &q);
    for(int i=0; i<n; i++){
        scanf("\n%s %d", name, &time);
        // printf("name is %s, time is %d\n", name, time);
        push_back(&head, &tail, name, time);
    }

    int elapsed_time = 0;
    while(n > 0){
        if(head->data <= q){
            elapsed_time += head->data;
            printf("%s %d\n", head->name, elapsed_time);
            pop_front(&head, &tail);
            n--;
        }
        else{
            elapsed_time += q;
            // char name[NAME_LEN];
            strcpy(name, head->name);
            int data = head->data - q;
            pop_front(&head, &tail);
            push_back(&head, &tail, name, data);
        }
    }

    return 0;
}

// 新しいノードのメモリを確保する
Node *create_node(const char *new_name, int new_data){
    Node *new_node = (Node *)malloc(sizeof(Node));
    if (!new_node) {
        fprintf(stderr, "could not allocate a node.\n");
        exit(1);
    }
    strcpy(new_node->name, new_name);
    new_node->data = new_data;
    new_node->next = NULL;
    // static Node new_node = {new_name, new_data, NULL}; // 定数じゃない（と静的領域にいない）のでだめ
    return new_node;
}


// リストのメモリを解放する
void clear_list(Node *head){
    while(head){
        Node *target = head;
        head = head->next;
        free(target);
    }
}

// pop した数を返す
int pop_front(Node **head_pointer, Node **tail_pointer){
    // そもそも空
    if(*head_pointer == NULL){
        fprintf(stderr, "mou pop dekinai\n");
        return 0;
    }

    Node *temp_head = *head_pointer;
    int ans = temp_head->data;
    // head を次のやつに更新
    *head_pointer = (*head_pointer) -> next;
    // head = tail, すなわち head->next = NULL のときはどっちも NULL にしないとだめ
    if(*head_pointer == NULL){
        *tail_pointer = NULL;
    }
    free(temp_head);
    return ans;
    
}


void push_back(Node **head_pointer, Node **tail_pointer, char *name, int new_data){
    if(*tail_pointer == NULL){
        // 今はまだ空
        Node *new_node = create_node(name, new_data);
        *head_pointer = new_node;
        *tail_pointer = new_node;
        return;
    }

    Node *newnode = create_node(name, new_data);
    (*tail_pointer)->next = newnode;
    *tail_pointer = newnode;

    return;
}


// リストの要素を先頭から順に出力する
void print_list(const Node *head){
  while(head){
    printf("| %d |-> ", head->data);
    head = head->next;
  }
  printf("NULL\n");
}
