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

int head=0;
int tail;

typedef struct{
  char name[10];
  int data;
}process;

int isEmpty();
void enqueue(process data);
void dequeue(int);
int size;

process *Q;
process *tmpQ;
process *endtime;

int main(){
  int q;
  int i,j,k=0;
  int time=0;
  int hastime;
  char space;
  int plus=0;

  scanf("%d %d",&size,&q);
  Q = (process *)malloc((size+1) * sizeof(process));

  endtime =  (process *)malloc((size+1) * sizeof(process));
      
  for(i=0;i<size;i++){
    scanf("%s",&Q[i].name);
    scanf("%d",&Q[i].data);
  }
  /*  
  for(i=0;i<size;i++){
    printf("%s %d\n",Q[i].name,Q[i].data);
  }
  */
  Q[size].data = 0;
  strcpy(Q[size].name,"empty"); 
  
 
  int sizekept = size;
  tail = size-1;
  int rest;
  rest = size;
  while(rest!=0){  // 残り個数が０になるまで
    /*
     	for(i=head;i<=size;i++){
	  printf("[%s %d] - ",Q[i].name,Q[i].data);
	}
	printf("//");
	for(i=0;i<head;i++){
	  printf("[%s %d] - ",Q[i].name,Q[i].data);
	}
	printf("\n");
    */
    hastime = Q[head].data;   //今持っている残り時間
    Q[head].data = hastime - q; //時間から指定分マイナス
   
    if(Q[head].data > 0) {   //時間がまだ残っている
	time += q;  
	enqueue(Q[head]);
		dequeue(Q[head].data);
      }     
      else{
	time += hastime;
	
	endtime[k].data = time;
	for(i=0;i<10;i++){
	  endtime[k].name[i] = Q[head].name[i]; 
	}
	//	printf("%s\n",endtime[k].name);	
	dequeue(Q[head].data);
	rest--;        
	//	printf("one item became 0\n");
	k++;
      }
  }
  
  for(i=0;i<sizekept;i++){
    printf("%s %d\n",endtime[i].name,endtime[i].data);
  }
  return 0;
}

void dequeue(int data){

  head = (head+1)%(size+1);
}

void enqueue(process data){

  Q[(tail+1)%(size+1)] = data;
  tail = (tail+1)%(size+1);
}


int isEmpty(){
  if(head==tail) return 0;
  else return 1;
}

