import java.util.*;
import java.io.*;

public class Paul {
	boolean solve(int r, String[] a, int W, boolean print) {
		int n = a.length;

		// dpL[i][w] = min { j | j >= i && len(a[j]) > w }
		int[][] dpL = new int[n+1][W+1];
		for (int[] row: dpL) Arrays.fill(row, n);
		{
			for (int i = n-1; i >= 0; i--) {
				dpL[i] = dpL[i+1].clone();
				for (int w = 0; w < a[i].length(); w++) {
					dpL[i][w] = i;
				}
			}
		}
		
		// dp[w] = number of words that fit into width w
		int[] dp = new int[W+1];
		int[] pred = new int[W+1];
		for (int w = 1; w <= W; w++) {
			for (int v = 0; v < w; v++) {
				int cur = Math.min(dp[v]+r, dpL[dp[v]][w-v-1]);
				if (cur > dp[w]) {
					dp[w] = cur;
					pred[w] = v;
				}
			}
		}
		
		if (dp[W] < n) return false;

		if (print) {
			while (W > 0 && dp[W-1] == n) W--;
			
			List<Integer> v = new ArrayList<>();
			v.add(W);
			for (; W > 0; W = pred[W]) {
				v.add(pred[W]);
			}
			Collections.reverse(v);


			int c = v.size() - 1;
			System.out.println(r + " " + c);

			int[] w = new int[c];
			for (int j = 0; j < c; j++) {
				w[j] = v.get(j+1) - v.get(j) - 1;
				if (j+1 < c) {
					System.out.print(w[j] + " ");
				} else {
					System.out.println(w[j]);
				}
			}
			
			int[][] table = new int[r][c];
			for (int[] row: table) Arrays.fill(row, -1);
			{
				int j = 0, i = 0;
				for (int k = 0; k < n; k++) {
					if (i == r || a[k].length() > w[j]) {
						j++;
						i = 0;
					}
					table[i++][j] = k;
				}
			}

			for (int i = 0; i < r; i++) {
				for (int j = 0; j < c; j++) {
					String s = table[i][j] >= 0 ? a[table[i][j]] : "";
					int cw = j+1 < c ? w[j]+1 : w[j];
					System.out.print(String.format("%-" + cw + "s", s));
				}
				System.out.println();
			}
		}
		
		return true;
	}

	void run() throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] nums = br.readLine().split(" ");
		int n = Integer.valueOf(nums[0]);
		int W = Integer.valueOf(nums[1]) + 1;
	
		String[] a = new String[n];
		for (int k = 0; k < n; k++) {
			a[k] = br.readLine();
		}

		int rmin = 0, rmax = n;
		while (rmax-rmin > 1) {
			int r = (rmin+rmax)/2;
			if (solve(r, a, W, false)) {
				rmax = r;
			} else {
				rmin = r;
			}
		}
		
		solve(rmax, a, W, true);
	}

	public static void main(String[] args) throws Exception { 
		new Paul().run();
	}
}
