import java.util.Scanner;

public class Main {
	private static int head = 0;// キューの先頭ポインタ
	private static int tail = 0;// キューの末尾ポイント
	private static final int MAX = 100005; // 制約のプロセス数が10万なので少し多めに。
	private static Process[] queue = new Process[MAX];

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int q = sc.nextInt();
		// すべてのプロセスをキューに追加
		for (int i = 0; i < n; i++) {
			String name = sc.next();
			int time = sc.nextInt();
			Process p = new Process(name, time);
			queue[i] = p;
		}
		tail = n;
		// すべてのプロセスが完了する（＝キューが空になる）まで実行
		int elaps = 0; // 経過時間
		while (!(head == tail)) {
			Process p = dequeue();
			if (p.time > q) {
				p.time = p.time - q;
				enqueue(p);
				elaps += q;
			} else {
				elaps += p.time;
				System.out.println(p.name + " " + elaps);
			}
		}

	}

	private static void enqueue(Process p) {
		// 中身が満タンでないことを判定
		if ((tail + 1) % MAX == head) {
			System.err.println("エラー（オーバーフロー）");
		} else {
			queue[tail] = p;
			tail = (tail + 1) % MAX;
		}
	}

	private static Process dequeue() {
		// 中身が空じゃないことを判定
		Process ret = null;
		if (head == tail) {
			System.err.println("エラー（アンダーフロー）");
		} else {
			ret = queue[head];
			head = (head + 1) % MAX;
		}
		return ret;

	}

}

class Process {
	String name;
	int time;

	public Process(String name, int time) {
		this.name = name;
		this.time = time;
	}

} import java.util.Scanner; Scanner java.util public class Main {
	private static int head = 0;// キューの先頭ポインタ
	private static int tail = 0;// キューの末尾ポイント
	private static final int MAX = 100005; // 制約のプロセス数が10万なので少し多めに。
	private static Process[] queue = new Process[MAX];

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int q = sc.nextInt();
		// すべてのプロセスをキューに追加
		for (int i = 0; i < n; i++) {
			String name = sc.next();
			int time = sc.nextInt();
			Process p = new Process(name, time);
			queue[i] = p;
		}
		tail = n;
		// すべてのプロセスが完了する（＝キューが空になる）まで実行
		int elaps = 0; // 経過時間
		while (!(head == tail)) {
			Process p = dequeue();
			if (p.time > q) {
				p.time = p.time - q;
				enqueue(p);
				elaps += q;
			} else {
				elaps += p.time;
				System.out.println(p.name + " " + elaps);
			}
		}

	}

	private static void enqueue(Process p) {
		// 中身が満タンでないことを判定
		if ((tail + 1) % MAX == head) {
			System.err.println("エラー（オーバーフロー）");
		} else {
			queue[tail] = p;
			tail = (tail + 1) % MAX;
		}
	}

	private static Process dequeue() {
		// 中身が空じゃないことを判定
		Process ret = null;
		if (head == tail) {
			System.err.println("エラー（アンダーフロー）");
		} else {
			ret = queue[head];
			head = (head + 1) % MAX;
		}
		return ret;

	}

} Main private static int head = 0;// キューの先頭ポインタ head 0 private static int tail = 0;// キューの末尾ポイント tail 0 private static final int MAX = 100005; // 制約のプロセス数が10万なので少し多めに。 MAX 100005 private static Process[] queue = new Process[MAX]; queue new Process[MAX] MAX public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int q = sc.nextInt();
		// すべてのプロセスをキューに追加
		for (int i = 0; i < n; i++) {
			String name = sc.next();
			int time = sc.nextInt();
			Process p = new Process(name, time);
			queue[i] = p;
		}
		tail = n;
		// すべてのプロセスが完了する（＝キューが空になる）まで実行
		int elaps = 0; // 経過時間
		while (!(head == tail)) {
			Process p = dequeue();
			if (p.time > q) {
				p.time = p.time - q;
				enqueue(p);
				elaps += q;
			} else {
				elaps += p.time;
				System.out.println(p.name + " " + elaps);
			}
		}

	} main {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int q = sc.nextInt();
		// すべてのプロセスをキューに追加
		for (int i = 0; i < n; i++) {
			String name = sc.next();
			int time = sc.nextInt();
			Process p = new Process(name, time);
			queue[i] = p;
		}
		tail = n;
		// すべてのプロセスが完了する（＝キューが空になる）まで実行
		int elaps = 0; // 経過時間
		while (!(head == tail)) {
			Process p = dequeue();
			if (p.time > q) {
				p.time = p.time - q;
				enqueue(p);
				elaps += q;
			} else {
				elaps += p.time;
				System.out.println(p.name + " " + elaps);
			}
		}

	} Scanner sc = new Scanner(System.in); sc new Scanner(System.in) int n = sc.nextInt(); n sc.nextInt() sc.nextInt sc int q = sc.nextInt(); q sc.nextInt() sc.nextInt sc for (int i = 0; i < n; i++) {
			String name = sc.next();
			int time = sc.nextInt();
			Process p = new Process(name, time);
			queue[i] = p;
		} int i = 0; int i = 0; i 0 i < n i n i++ i++ i {
			String name = sc.next();
			int time = sc.nextInt();
			Process p = new Process(name, time);
			queue[i] = p;
		} {
			String name = sc.next();
			int time = sc.nextInt();
			Process p = new Process(name, time);
			queue[i] = p;
		} String name = sc.next(); name sc.next() sc.next sc int time = sc.nextInt(); time sc.nextInt() sc.nextInt sc Process p = new Process(name, time); p new Process(name, time) queue[i] = p queue[i] queue i p tail = n tail n int elaps = 0; elaps 0 while (!(head == tail)) {
			Process p = dequeue();
			if (p.time > q) {
				p.time = p.time - q;
				enqueue(p);
				elaps += q;
			} else {
				elaps += p.time;
				System.out.println(p.name + " " + elaps);
			}
		} !(head == tail) (head == tail) head tail {
			Process p = dequeue();
			if (p.time > q) {
				p.time = p.time - q;
				enqueue(p);
				elaps += q;
			} else {
				elaps += p.time;
				System.out.println(p.name + " " + elaps);
			}
		} Process p = dequeue(); p dequeue() dequeue if (p.time > q) {
				p.time = p.time - q;
				enqueue(p);
				elaps += q;
			} else {
				elaps += p.time;
				System.out.println(p.name + " " + elaps);
			} p.time > q p.time p p.time q {
				p.time = p.time - q;
				enqueue(p);
				elaps += q;
			} p.time = p.time - q p.time p p.time p.time - q p.time p p.time q enqueue(p) enqueue p elaps += q elaps q {
				elaps += p.time;
				System.out.println(p.name + " " + elaps);
			} elaps += p.time elaps p.time p p.time System.out.println(p.name + " " + elaps) System.out.println System.out System System.out p.name + " " + elaps p.name + " " + elaps p.name p p.name " " elaps String[] args args private static void enqueue(Process p) {
		// 中身が満タンでないことを判定
		if ((tail + 1) % MAX == head) {
			System.err.println("エラー（オーバーフロー）");
		} else {
			queue[tail] = p;
			tail = (tail + 1) % MAX;
		}
	} enqueue {
		// 中身が満タンでないことを判定
		if ((tail + 1) % MAX == head) {
			System.err.println("エラー（オーバーフロー）");
		} else {
			queue[tail] = p;
			tail = (tail + 1) % MAX;
		}
	} if ((tail + 1) % MAX == head) {
			System.err.println("エラー（オーバーフロー）");
		} else {
			queue[tail] = p;
			tail = (tail + 1) % MAX;
		} (tail + 1) % MAX == head (tail + 1) % MAX (tail + 1) tail 1 MAX head {
			System.err.println("エラー（オーバーフロー）");
		} System.err.println("エラー（オーバーフロー）") System.err.println System.err System System.err "エラー（オーバーフロー）" {
			queue[tail] = p;
			tail = (tail + 1) % MAX;
		} queue[tail] = p queue[tail] queue tail p tail = (tail + 1) % MAX tail (tail + 1) % MAX (tail + 1) tail 1 MAX Process p p private static Process dequeue() {
		// 中身が空じゃないことを判定
		Process ret = null;
		if (head == tail) {
			System.err.println("エラー（アンダーフロー）");
		} else {
			ret = queue[head];
			head = (head + 1) % MAX;
		}
		return ret;

	} dequeue {
		// 中身が空じゃないことを判定
		Process ret = null;
		if (head == tail) {
			System.err.println("エラー（アンダーフロー）");
		} else {
			ret = queue[head];
			head = (head + 1) % MAX;
		}
		return ret;

	} Process ret = null; ret null if (head == tail) {
			System.err.println("エラー（アンダーフロー）");
		} else {
			ret = queue[head];
			head = (head + 1) % MAX;
		} head == tail head tail {
			System.err.println("エラー（アンダーフロー）");
		} System.err.println("エラー（アンダーフロー）") System.err.println System.err System System.err "エラー（アンダーフロー）" {
			ret = queue[head];
			head = (head + 1) % MAX;
		} ret = queue[head] ret queue[head] queue head head = (head + 1) % MAX head (head + 1) % MAX (head + 1) head 1 MAX return ret; ret class Process {
	String name;
	int time;

	public Process(String name, int time) {
		this.name = name;
		this.time = time;
	}

} Process String name; name int time; time public Process(String name, int time) {
		this.name = name;
		this.time = time;
	} Process {
		this.name = name;
		this.time = time;
	} this.name = name this.name this this.name name this.time = time this.time this this.time time String name name int time time public class Main {
	private static int head = 0;// キューの先頭ポインタ
	private static int tail = 0;// キューの末尾ポイント
	private static final int MAX = 100005; // 制約のプロセス数が10万なので少し多めに。
	private static Process[] queue = new Process[MAX];

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int q = sc.nextInt();
		// すべてのプロセスをキューに追加
		for (int i = 0; i < n; i++) {
			String name = sc.next();
			int time = sc.nextInt();
			Process p = new Process(name, time);
			queue[i] = p;
		}
		tail = n;
		// すべてのプロセスが完了する（＝キューが空になる）まで実行
		int elaps = 0; // 経過時間
		while (!(head == tail)) {
			Process p = dequeue();
			if (p.time > q) {
				p.time = p.time - q;
				enqueue(p);
				elaps += q;
			} else {
				elaps += p.time;
				System.out.println(p.name + " " + elaps);
			}
		}

	}

	private static void enqueue(Process p) {
		// 中身が満タンでないことを判定
		if ((tail + 1) % MAX == head) {
			System.err.println("エラー（オーバーフロー）");
		} else {
			queue[tail] = p;
			tail = (tail + 1) % MAX;
		}
	}

	private static Process dequeue() {
		// 中身が空じゃないことを判定
		Process ret = null;
		if (head == tail) {
			System.err.println("エラー（アンダーフロー）");
		} else {
			ret = queue[head];
			head = (head + 1) % MAX;
		}
		return ret;

	}

} public class Main {
	private static int head = 0;// キューの先頭ポインタ
	private static int tail = 0;// キューの末尾ポイント
	private static final int MAX = 100005; // 制約のプロセス数が10万なので少し多めに。
	private static Process[] queue = new Process[MAX];

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int q = sc.nextInt();
		// すべてのプロセスをキューに追加
		for (int i = 0; i < n; i++) {
			String name = sc.next();
			int time = sc.nextInt();
			Process p = new Process(name, time);
			queue[i] = p;
		}
		tail = n;
		// すべてのプロセスが完了する（＝キューが空になる）まで実行
		int elaps = 0; // 経過時間
		while (!(head == tail)) {
			Process p = dequeue();
			if (p.time > q) {
				p.time = p.time - q;
				enqueue(p);
				elaps += q;
			} else {
				elaps += p.time;
				System.out.println(p.name + " " + elaps);
			}
		}

	}

	private static void enqueue(Process p) {
		// 中身が満タンでないことを判定
		if ((tail + 1) % MAX == head) {
			System.err.println("エラー（オーバーフロー）");
		} else {
			queue[tail] = p;
			tail = (tail + 1) % MAX;
		}
	}

	private static Process dequeue() {
		// 中身が空じゃないことを判定
		Process ret = null;
		if (head == tail) {
			System.err.println("エラー（アンダーフロー）");
		} else {
			ret = queue[head];
			head = (head + 1) % MAX;
		}
		return ret;

	}

} Main
import java.util.Scanner;

public class Main {
	private static int head = 0;// キューの先頭ポインタ
	private static int tail = 0;// キューの末尾ポイント
	private static final int MAX = 100005; // 制約のプロセス数が10万なので少し多めに。
	private static Process[] queue = new Process[MAX];

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int q = sc.nextInt();
		// すべてのプロセスをキューに追加
		for (int i = 0; i < n; i++) {
			String name = sc.next();
			int time = sc.nextInt();
			Process p = new Process(name, time);
			queue[i] = p;
		}
		tail = n;
		// すべてのプロセスが完了する（＝キューが空になる）まで実行
		int elaps = 0; // 経過時間
		while (!(head == tail)) {
			Process p = dequeue();
			if (p.time > q) {
				p.time = p.time - q;
				enqueue(p);
				elaps += q;
			} else {
				elaps += p.time;
				System.out.println(p.name + " " + elaps);
			}
		}

	}

	private static void enqueue(Process p) {
		// 中身が満タンでないことを判定
		if ((tail + 1) % MAX == head) {
			System.err.println("エラー（オーバーフロー）");
		} else {
			queue[tail] = p;
			tail = (tail + 1) % MAX;
		}
	}

	private static Process dequeue() {
		// 中身が空じゃないことを判定
		Process ret = null;
		if (head == tail) {
			System.err.println("エラー（アンダーフロー）");
		} else {
			ret = queue[head];
			head = (head + 1) % MAX;
		}
		return ret;

	}

}

class Process {
	String name;
	int time;

	public Process(String name, int time) {
		this.name = name;
		this.time = time;
	}

}
