import java.util.Calendar;

public class MyCal2 {
	public static int[] monthinfo(Calendar cal) {
		int[] minfo = new int[8]; // weekday, # of days in month, month number
									// 1-base, year ; NEXT DAY

		int k = cal.get(Calendar.DAY_OF_WEEK);
		minfo[0] = (k == 7) ? 0 : k - 1;
		minfo[1] = cal.getMaximum(Calendar.DAY_OF_MONTH);
		minfo[2] = cal.get(Calendar.MONTH) + 1;
		minfo[3] = cal.get(Calendar.YEAR);
		cal.roll(Calendar.MONDAY, 1);
		k = cal.get(Calendar.DAY_OF_WEEK);
		minfo[4] = (k == 7) ? 0 : k - 1;
		minfo[5] = cal.getMaximum(Calendar.DAY_OF_MONTH);
		minfo[6] = cal.get(Calendar.MONTH) + 1;
		minfo[7] = cal.get(Calendar.YEAR);
		return minfo;
	}

	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance();

		int y = cal.get(Calendar.YEAR);
		int m = cal.get(Calendar.MONTH);
		cal.set(y, m, 1);

		String[] mpr = new String[8];
		for (int k = 0; k < mpr.length; k++) {
			mpr[k] = "";
		}

		int[] minfo = monthinfo(cal);
		for (int d : minfo) {
			System.out.printf("%d ", d);
		}
		System.out.println();

		// months[i] = name of month i
		String[] months = {
				"", // leave empty so that months[1] = "January"
				"January", "February", "March", "April", "May", "June", "July",
				"August", "September", "October", "November", "December" };

		// print calendar header
		// starting day
		int d = minfo[0];
		int maxday = minfo[1];
		int M = minfo[2];
		int Y = minfo[3];
		mpr[0] = "   " + months[M] + " " + Y + "    ";
		mpr[1] = " S  M Tu  W Th  F  S ";

		// print the calendar
		int row = 2;
		for (int k = 0; k < d; k++)
			mpr[row] += "   ";

		for (int k = 1; k <= minfo[1]; k++) {
			mpr[row] += String.format("%2d ", k);
			if ((k + d) % 7 == 0)
				row++;
		}
		
		for (int k = 0; k < mpr.length; k++) {
			mpr[k] += "    ";
		}

		d = minfo[4];
		maxday = minfo[5];
		M = minfo[6];
		Y = minfo[7];
		mpr[0] += "   " + months[M] + " " + Y;
		mpr[1] += " S  M Tu  W Th  F  S";

		// print the calendar
		row = 2;
		for (int k = 0; k < d; k++)
			mpr[row] += "   ";

		for (int k = 1; k <= minfo[1]; k++) {
			mpr[row] += String.format("%2d ", k);
			if ((k + d) % 7 == 0)
				row++;
		}
		for (String s : mpr) {
			System.out.println(s);
		}
	}
}
