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

#define MAX 100005//c语言用define来宏定义，不要用c++习惯的const int 

typedef struct pp{//千万不要少了前面的typedef关键字 
	char name[100];//task name
	int t;//task
}p;

p Q[MAX];//有了这个结构体数组就能很方便的将任务名和任务对应存入了 

int head,tail;

/* 
//判断栈空
int isEmpty()
{
	return head==tail;	//如果定义成bool类型要预编译调用c标准库里的布尔函数 
} 

//判断栈是否满 
int isFull()
{
	return head==(tail+1)%MAX;	
} */

//入队
void enqueue(p x)
{
	//if(isFull)return;
	Q[tail]=x;//这里只能是tail，不能是head ，因为队列是先进先出，tail对应的等会儿能用head直接取出来，否则不满足先进先出 
	tail=(tail+1)%MAX;
}

//出队 ，定义成结构体类型才能返回结构体作为值 
p dequeue()
{
	//if(isEmpty())return;
	p x=Q[head];//这里只能是head，不能是tail 
	head=(head+1)%MAX;
	return x;
}

int main()
{
	//读入数据 
	int n,tms;
	scanf("%d%d",&n,&tms); 
	int i;
	for(i=1;i<=n;i++){
		scanf("%s",Q[i].name);//字符串存入不能加取地址符 
		scanf("%d",&Q[i].t);
	}
	p u;//为了后面输出 
	head=1,tail=n+1;
	int cnt=0;
	while(head!=tail){
		u=dequeue();
		//int cnt=0;注意这里不能临时定义一个变量cnt存储时间，后面出队的元素肯定已经经过了前面元素的时间，所以时间是叠加的 
		if(u.t>=tms){
			cnt+=tms;
		}else{
			cnt+=u.t;
		}
		u.t-=tms; 
		if(u.t<=0){
			printf("%s %d\n",u.name,cnt);
		}else{
			enqueue(u);
		} 
	}
	return 0;
}
