#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define NMAX 100000
#define LMAX 10
// ノードを表す構造体
struct Node {
  int data ;
  char name[LMAX];
  struct Node * next ;
} ;

typedef struct Node Node ;

// 新しいノードのメモリを確保する
Node *create_node(int new_data, char name[]) {
  Node *new_node = (Node *) malloc(sizeof(Node));
  if (!new_node) {
    fprintf(stderr, "could not allocate a node.\n");
    exit(1);
  }
  new_node->data = new_data;
  strcpy(new_node->name, name);
  new_node->next = NULL;
  return new_node;
}

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


//リストが空か否か判定する
int is_empty(Node *head){
  if(head == NULL){
    return 1;
  }
  return 0;
}

//リストの最後尾にノードを追加する
void push_back(Node **head, Node **tail, int new_data, char new_name[]){
  Node *new_node = create_node(new_data, new_name);
  if(is_empty(*head)){
    *head = new_node;
    *tail = new_node;
    return;
  }
  (*tail)->next = new_node;
  (*tail) = (*tail)->next;
}


//リストの先頭からノードを削除する
Node pop_front(Node **head){
  Node c = **head;
  Node *tmp = *head;
  *head = (*head)->next;
  free(tmp);
  return c;
}


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

int main(void) {
  int n, q;
  char name[LMAX];
  int time;
  Node * head = NULL , *tail = NULL;
  
  scanf("%d%d", &n, &q);
  for(int i = 0; i < n; ++i){
    scanf("%s%d", name, &time);
    push_back(&head, &tail, time, name);
  }
  //print_list(head);

  Node tmp;
  int t = 0;
  while(!is_empty(head)){
    tmp = pop_front(&head);
    if(tmp.data <= q){
      t += tmp.data;
      printf("%s %d\n", tmp.name, t);
    }
    else{
      tmp.data -= q;
      push_back(&head, &tail, tmp.data, tmp.name);
      t += q;
    }
  }
  

  
  clear_list(head) ;
  return 0 ;
}

