import java.util.Calendar;

public class MyCal3 {
	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.add(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();

		cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 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();
		 */

		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 weekday, maxday, month, year, row;
		
		int nm = 0;
		for (int m = 0; m < 2; m++) {
			weekday = minfo[nm++];
			maxday = minfo[nm++];
			month = minfo[nm++];
			year = minfo[nm++];
			mpr[0] += "    " + months[month] + " " + year + "     ";
			mpr[1] += " S  M Tu  W Th  F  S ";

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

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