import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Scanner;

/**
 * ZAKIREN第5章
 *
 * @author K.Yamauchi
 *
 */
public class Main {

	/** 入力用 */
	private static Scanner scan = new Scanner(System.in);

	/** 出力用 */
	private static StringBuilder stringBuilder = new StringBuilder();

	/**
	 * メイン。
	 * @param args
	 */
	public static void main(String[] args) {

		// １行目の読み込み
		String[] firstLine = scan.nextLine().split(" ");
		int size = Integer.parseInt(firstLine[0]);

		// 2行目以降（プロセスとクオンタム）の読み込み
		String[] processes = new String[size];
		for (int i = 0; i < size; i++) {
			processes[i] = scan.nextLine();
		}

		// 読み込み終了
		scan.close();
		scan = null;

		// 計算を実行
		calculation(size, Integer.parseInt(firstLine[1]), processes);

		// 結果出力
//		System.out.println(stringBuilder.toString());

	}

	/**
	 *
	 * @param size
	 * @param quantum
	 * @param processes
	 */
	private static void calculation(int size, int quantum, String[] processes) {

		// 計算用キュー
		Queue<String> queue = new ArrayDeque<>();

		// キューにプロセスを設定
		for (int i = 0; i < size; i++) {
			queue.add(processes[i]);
		}

		// 経過時間
		int elapsedTime = 0;

		// キューの中身がなくなるまで計算
		while (!queue.isEmpty()) {
			// キューからプロセスを一つ取得
			String[] process = queue.poll().split(" ");
			// 取得したプロセスの残り時間
			int remainedTime = Integer.parseInt(process[1]);

			if (remainedTime <= quantum) {
				// プロセスの残り時間がクオンタム以下であれば、そのプロセスは終了
				stringBuilder.append(process[0] + " " + (elapsedTime + remainedTime) + "\n");
				System.out.println(process[0] + " " + (elapsedTime + remainedTime));
				elapsedTime -= (quantum - remainedTime);
			} else {
				// プロセスの残り時間がクオンタムより大きければ、クオンタム分残り時間を減らし、再度キューに登録
				remainedTime -= quantum;
				queue.add(process[0] + " " + remainedTime);
			}
			elapsedTime += quantum;
		}

	}

}
 import java.util.ArrayDeque; ArrayDeque java.util import java.util.Queue; Queue java.util import java.util.Scanner; Scanner java.util public class Main {

	/** 入力用 */
	private static Scanner scan = new Scanner(System.in);

	/** 出力用 */
	private static StringBuilder stringBuilder = new StringBuilder();

	/**
	 * メイン。
	 * @param args
	 */
	public static void main(String[] args) {

		// １行目の読み込み
		String[] firstLine = scan.nextLine().split(" ");
		int size = Integer.parseInt(firstLine[0]);

		// 2行目以降（プロセスとクオンタム）の読み込み
		String[] processes = new String[size];
		for (int i = 0; i < size; i++) {
			processes[i] = scan.nextLine();
		}

		// 読み込み終了
		scan.close();
		scan = null;

		// 計算を実行
		calculation(size, Integer.parseInt(firstLine[1]), processes);

		// 結果出力
//		System.out.println(stringBuilder.toString());

	}

	/**
	 *
	 * @param size
	 * @param quantum
	 * @param processes
	 */
	private static void calculation(int size, int quantum, String[] processes) {

		// 計算用キュー
		Queue<String> queue = new ArrayDeque<>();

		// キューにプロセスを設定
		for (int i = 0; i < size; i++) {
			queue.add(processes[i]);
		}

		// 経過時間
		int elapsedTime = 0;

		// キューの中身がなくなるまで計算
		while (!queue.isEmpty()) {
			// キューからプロセスを一つ取得
			String[] process = queue.poll().split(" ");
			// 取得したプロセスの残り時間
			int remainedTime = Integer.parseInt(process[1]);

			if (remainedTime <= quantum) {
				// プロセスの残り時間がクオンタム以下であれば、そのプロセスは終了
				stringBuilder.append(process[0] + " " + (elapsedTime + remainedTime) + "\n");
				System.out.println(process[0] + " " + (elapsedTime + remainedTime));
				elapsedTime -= (quantum - remainedTime);
			} else {
				// プロセスの残り時間がクオンタムより大きければ、クオンタム分残り時間を減らし、再度キューに登録
				remainedTime -= quantum;
				queue.add(process[0] + " " + remainedTime);
			}
			elapsedTime += quantum;
		}

	}

} Main /** 入力用 */
	private static Scanner scan = new Scanner(System.in); scan new Scanner(System.in) /** 出力用 */
	private static StringBuilder stringBuilder = new StringBuilder(); stringBuilder new StringBuilder() /**
	 * メイン。
	 * @param args
	 */
	public static void main(String[] args) {

		// １行目の読み込み
		String[] firstLine = scan.nextLine().split(" ");
		int size = Integer.parseInt(firstLine[0]);

		// 2行目以降（プロセスとクオンタム）の読み込み
		String[] processes = new String[size];
		for (int i = 0; i < size; i++) {
			processes[i] = scan.nextLine();
		}

		// 読み込み終了
		scan.close();
		scan = null;

		// 計算を実行
		calculation(size, Integer.parseInt(firstLine[1]), processes);

		// 結果出力
//		System.out.println(stringBuilder.toString());

	} main {

		// １行目の読み込み
		String[] firstLine = scan.nextLine().split(" ");
		int size = Integer.parseInt(firstLine[0]);

		// 2行目以降（プロセスとクオンタム）の読み込み
		String[] processes = new String[size];
		for (int i = 0; i < size; i++) {
			processes[i] = scan.nextLine();
		}

		// 読み込み終了
		scan.close();
		scan = null;

		// 計算を実行
		calculation(size, Integer.parseInt(firstLine[1]), processes);

		// 結果出力
//		System.out.println(stringBuilder.toString());

	} String[] firstLine = scan.nextLine().split(" "); firstLine scan.nextLine().split(" ") scan.nextLine().split scan.nextLine() scan.nextLine scan " " int size = Integer.parseInt(firstLine[0]); size Integer.parseInt(firstLine[0]) Integer.parseInt Integer firstLine[0] firstLine 0 String[] processes = new String[size]; processes new String[size] size for (int i = 0; i < size; i++) {
			processes[i] = scan.nextLine();
		} int i = 0; int i = 0; i 0 i < size i size i++ i++ i {
			processes[i] = scan.nextLine();
		} {
			processes[i] = scan.nextLine();
		} processes[i] = scan.nextLine() processes[i] processes i scan.nextLine() scan.nextLine scan scan.close() scan.close scan scan = null scan null calculation(size, Integer.parseInt(firstLine[1]), processes) calculation size Integer.parseInt(firstLine[1]) Integer.parseInt Integer firstLine[1] firstLine 1 processes String[] args args /**
	 *
	 * @param size
	 * @param quantum
	 * @param processes
	 */
	private static void calculation(int size, int quantum, String[] processes) {

		// 計算用キュー
		Queue<String> queue = new ArrayDeque<>();

		// キューにプロセスを設定
		for (int i = 0; i < size; i++) {
			queue.add(processes[i]);
		}

		// 経過時間
		int elapsedTime = 0;

		// キューの中身がなくなるまで計算
		while (!queue.isEmpty()) {
			// キューからプロセスを一つ取得
			String[] process = queue.poll().split(" ");
			// 取得したプロセスの残り時間
			int remainedTime = Integer.parseInt(process[1]);

			if (remainedTime <= quantum) {
				// プロセスの残り時間がクオンタム以下であれば、そのプロセスは終了
				stringBuilder.append(process[0] + " " + (elapsedTime + remainedTime) + "\n");
				System.out.println(process[0] + " " + (elapsedTime + remainedTime));
				elapsedTime -= (quantum - remainedTime);
			} else {
				// プロセスの残り時間がクオンタムより大きければ、クオンタム分残り時間を減らし、再度キューに登録
				remainedTime -= quantum;
				queue.add(process[0] + " " + remainedTime);
			}
			elapsedTime += quantum;
		}

	} calculation {

		// 計算用キュー
		Queue<String> queue = new ArrayDeque<>();

		// キューにプロセスを設定
		for (int i = 0; i < size; i++) {
			queue.add(processes[i]);
		}

		// 経過時間
		int elapsedTime = 0;

		// キューの中身がなくなるまで計算
		while (!queue.isEmpty()) {
			// キューからプロセスを一つ取得
			String[] process = queue.poll().split(" ");
			// 取得したプロセスの残り時間
			int remainedTime = Integer.parseInt(process[1]);

			if (remainedTime <= quantum) {
				// プロセスの残り時間がクオンタム以下であれば、そのプロセスは終了
				stringBuilder.append(process[0] + " " + (elapsedTime + remainedTime) + "\n");
				System.out.println(process[0] + " " + (elapsedTime + remainedTime));
				elapsedTime -= (quantum - remainedTime);
			} else {
				// プロセスの残り時間がクオンタムより大きければ、クオンタム分残り時間を減らし、再度キューに登録
				remainedTime -= quantum;
				queue.add(process[0] + " " + remainedTime);
			}
			elapsedTime += quantum;
		}

	} Queue<String> queue = new ArrayDeque<>(); queue new ArrayDeque<>() for (int i = 0; i < size; i++) {
			queue.add(processes[i]);
		} int i = 0; int i = 0; i 0 i < size i size i++ i++ i {
			queue.add(processes[i]);
		} {
			queue.add(processes[i]);
		} queue.add(processes[i]) queue.add queue processes[i] processes i int elapsedTime = 0; elapsedTime 0 while (!queue.isEmpty()) {
			// キューからプロセスを一つ取得
			String[] process = queue.poll().split(" ");
			// 取得したプロセスの残り時間
			int remainedTime = Integer.parseInt(process[1]);

			if (remainedTime <= quantum) {
				// プロセスの残り時間がクオンタム以下であれば、そのプロセスは終了
				stringBuilder.append(process[0] + " " + (elapsedTime + remainedTime) + "\n");
				System.out.println(process[0] + " " + (elapsedTime + remainedTime));
				elapsedTime -= (quantum - remainedTime);
			} else {
				// プロセスの残り時間がクオンタムより大きければ、クオンタム分残り時間を減らし、再度キューに登録
				remainedTime -= quantum;
				queue.add(process[0] + " " + remainedTime);
			}
			elapsedTime += quantum;
		} !queue.isEmpty() queue.isEmpty() queue.isEmpty queue {
			// キューからプロセスを一つ取得
			String[] process = queue.poll().split(" ");
			// 取得したプロセスの残り時間
			int remainedTime = Integer.parseInt(process[1]);

			if (remainedTime <= quantum) {
				// プロセスの残り時間がクオンタム以下であれば、そのプロセスは終了
				stringBuilder.append(process[0] + " " + (elapsedTime + remainedTime) + "\n");
				System.out.println(process[0] + " " + (elapsedTime + remainedTime));
				elapsedTime -= (quantum - remainedTime);
			} else {
				// プロセスの残り時間がクオンタムより大きければ、クオンタム分残り時間を減らし、再度キューに登録
				remainedTime -= quantum;
				queue.add(process[0] + " " + remainedTime);
			}
			elapsedTime += quantum;
		} String[] process = queue.poll().split(" "); process queue.poll().split(" ") queue.poll().split queue.poll() queue.poll queue " " int remainedTime = Integer.parseInt(process[1]); remainedTime Integer.parseInt(process[1]) Integer.parseInt Integer process[1] process 1 if (remainedTime <= quantum) {
				// プロセスの残り時間がクオンタム以下であれば、そのプロセスは終了
				stringBuilder.append(process[0] + " " + (elapsedTime + remainedTime) + "\n");
				System.out.println(process[0] + " " + (elapsedTime + remainedTime));
				elapsedTime -= (quantum - remainedTime);
			} else {
				// プロセスの残り時間がクオンタムより大きければ、クオンタム分残り時間を減らし、再度キューに登録
				remainedTime -= quantum;
				queue.add(process[0] + " " + remainedTime);
			} remainedTime <= quantum remainedTime quantum {
				// プロセスの残り時間がクオンタム以下であれば、そのプロセスは終了
				stringBuilder.append(process[0] + " " + (elapsedTime + remainedTime) + "\n");
				System.out.println(process[0] + " " + (elapsedTime + remainedTime));
				elapsedTime -= (quantum - remainedTime);
			} stringBuilder.append(process[0] + " " + (elapsedTime + remainedTime) + "\n") stringBuilder.append stringBuilder process[0] + " " + (elapsedTime + remainedTime) + "\n" (elapsedTime + remainedTime) process[0] + " " + (elapsedTime + remainedTime) + "\n" process[0] process 0 " " (elapsedTime + remainedTime) elapsedTime remainedTime "\n" System.out.println(process[0] + " " + (elapsedTime + remainedTime)) System.out.println System.out System System.out process[0] + " " + (elapsedTime + remainedTime) process[0] + " " + (elapsedTime + remainedTime) process[0] process 0 " " (elapsedTime + remainedTime) elapsedTime remainedTime elapsedTime -= (quantum - remainedTime) elapsedTime (quantum - remainedTime) quantum remainedTime {
				// プロセスの残り時間がクオンタムより大きければ、クオンタム分残り時間を減らし、再度キューに登録
				remainedTime -= quantum;
				queue.add(process[0] + " " + remainedTime);
			} remainedTime -= quantum remainedTime quantum queue.add(process[0] + " " + remainedTime) queue.add queue process[0] + " " + remainedTime process[0] + " " + remainedTime process[0] process 0 " " remainedTime elapsedTime += quantum elapsedTime quantum int size size int quantum quantum String[] processes processes public class Main {

	/** 入力用 */
	private static Scanner scan = new Scanner(System.in);

	/** 出力用 */
	private static StringBuilder stringBuilder = new StringBuilder();

	/**
	 * メイン。
	 * @param args
	 */
	public static void main(String[] args) {

		// １行目の読み込み
		String[] firstLine = scan.nextLine().split(" ");
		int size = Integer.parseInt(firstLine[0]);

		// 2行目以降（プロセスとクオンタム）の読み込み
		String[] processes = new String[size];
		for (int i = 0; i < size; i++) {
			processes[i] = scan.nextLine();
		}

		// 読み込み終了
		scan.close();
		scan = null;

		// 計算を実行
		calculation(size, Integer.parseInt(firstLine[1]), processes);

		// 結果出力
//		System.out.println(stringBuilder.toString());

	}

	/**
	 *
	 * @param size
	 * @param quantum
	 * @param processes
	 */
	private static void calculation(int size, int quantum, String[] processes) {

		// 計算用キュー
		Queue<String> queue = new ArrayDeque<>();

		// キューにプロセスを設定
		for (int i = 0; i < size; i++) {
			queue.add(processes[i]);
		}

		// 経過時間
		int elapsedTime = 0;

		// キューの中身がなくなるまで計算
		while (!queue.isEmpty()) {
			// キューからプロセスを一つ取得
			String[] process = queue.poll().split(" ");
			// 取得したプロセスの残り時間
			int remainedTime = Integer.parseInt(process[1]);

			if (remainedTime <= quantum) {
				// プロセスの残り時間がクオンタム以下であれば、そのプロセスは終了
				stringBuilder.append(process[0] + " " + (elapsedTime + remainedTime) + "\n");
				System.out.println(process[0] + " " + (elapsedTime + remainedTime));
				elapsedTime -= (quantum - remainedTime);
			} else {
				// プロセスの残り時間がクオンタムより大きければ、クオンタム分残り時間を減らし、再度キューに登録
				remainedTime -= quantum;
				queue.add(process[0] + " " + remainedTime);
			}
			elapsedTime += quantum;
		}

	}

} public class Main {

	/** 入力用 */
	private static Scanner scan = new Scanner(System.in);

	/** 出力用 */
	private static StringBuilder stringBuilder = new StringBuilder();

	/**
	 * メイン。
	 * @param args
	 */
	public static void main(String[] args) {

		// １行目の読み込み
		String[] firstLine = scan.nextLine().split(" ");
		int size = Integer.parseInt(firstLine[0]);

		// 2行目以降（プロセスとクオンタム）の読み込み
		String[] processes = new String[size];
		for (int i = 0; i < size; i++) {
			processes[i] = scan.nextLine();
		}

		// 読み込み終了
		scan.close();
		scan = null;

		// 計算を実行
		calculation(size, Integer.parseInt(firstLine[1]), processes);

		// 結果出力
//		System.out.println(stringBuilder.toString());

	}

	/**
	 *
	 * @param size
	 * @param quantum
	 * @param processes
	 */
	private static void calculation(int size, int quantum, String[] processes) {

		// 計算用キュー
		Queue<String> queue = new ArrayDeque<>();

		// キューにプロセスを設定
		for (int i = 0; i < size; i++) {
			queue.add(processes[i]);
		}

		// 経過時間
		int elapsedTime = 0;

		// キューの中身がなくなるまで計算
		while (!queue.isEmpty()) {
			// キューからプロセスを一つ取得
			String[] process = queue.poll().split(" ");
			// 取得したプロセスの残り時間
			int remainedTime = Integer.parseInt(process[1]);

			if (remainedTime <= quantum) {
				// プロセスの残り時間がクオンタム以下であれば、そのプロセスは終了
				stringBuilder.append(process[0] + " " + (elapsedTime + remainedTime) + "\n");
				System.out.println(process[0] + " " + (elapsedTime + remainedTime));
				elapsedTime -= (quantum - remainedTime);
			} else {
				// プロセスの残り時間がクオンタムより大きければ、クオンタム分残り時間を減らし、再度キューに登録
				remainedTime -= quantum;
				queue.add(process[0] + " " + remainedTime);
			}
			elapsedTime += quantum;
		}

	}

} Main
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Scanner;

/**
 * ZAKIREN第5章
 *
 * @author K.Yamauchi
 *
 */
public class Main {

	/** 入力用 */
	private static Scanner scan = new Scanner(System.in);

	/** 出力用 */
	private static StringBuilder stringBuilder = new StringBuilder();

	/**
	 * メイン。
	 * @param args
	 */
	public static void main(String[] args) {

		// １行目の読み込み
		String[] firstLine = scan.nextLine().split(" ");
		int size = Integer.parseInt(firstLine[0]);

		// 2行目以降（プロセスとクオンタム）の読み込み
		String[] processes = new String[size];
		for (int i = 0; i < size; i++) {
			processes[i] = scan.nextLine();
		}

		// 読み込み終了
		scan.close();
		scan = null;

		// 計算を実行
		calculation(size, Integer.parseInt(firstLine[1]), processes);

		// 結果出力
//		System.out.println(stringBuilder.toString());

	}

	/**
	 *
	 * @param size
	 * @param quantum
	 * @param processes
	 */
	private static void calculation(int size, int quantum, String[] processes) {

		// 計算用キュー
		Queue<String> queue = new ArrayDeque<>();

		// キューにプロセスを設定
		for (int i = 0; i < size; i++) {
			queue.add(processes[i]);
		}

		// 経過時間
		int elapsedTime = 0;

		// キューの中身がなくなるまで計算
		while (!queue.isEmpty()) {
			// キューからプロセスを一つ取得
			String[] process = queue.poll().split(" ");
			// 取得したプロセスの残り時間
			int remainedTime = Integer.parseInt(process[1]);

			if (remainedTime <= quantum) {
				// プロセスの残り時間がクオンタム以下であれば、そのプロセスは終了
				stringBuilder.append(process[0] + " " + (elapsedTime + remainedTime) + "\n");
				System.out.println(process[0] + " " + (elapsedTime + remainedTime));
				elapsedTime -= (quantum - remainedTime);
			} else {
				// プロセスの残り時間がクオンタムより大きければ、クオンタム分残り時間を減らし、再度キューに登録
				remainedTime -= quantum;
				queue.add(process[0] + " " + remainedTime);
			}
			elapsedTime += quantum;
		}

	}

}

