import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Queue;
import java.util.Scanner;

public class nC {

	Scanner in;
	PrintWriter out;

	class Point {
		int i;
		int j;
		int value;

		Point(int i, int j, int value) {
			this.i = i;
			this.j = j;
			this.value = value;
		}
	}

	void solve() {
		int n = in.nextInt();
		int m = in.nextInt();
		in.nextLine();
		Point a[][] = new Point[n][m];
		for (int i = 0; i < n; i++) {
			String s = in.nextLine();
			for (int j = 0; j < s.length(); j++) {
				if (s.charAt(j) == '0') {
					a[i][j] = new Point(i, j, 0);
				} else if (s.charAt(j) == '1') {
					a[i][j] = new Point(i, j, 1);
				} else {
					throw new Error();
				}
			}
		}
		boolean used[][] = new boolean[n][m];
		int col = 0;
		int max = 0;
		ArrayList<Point> list = new ArrayList<Point>();
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (!used[i][j] && a[i][j].value == 1) {
					col++;
					list.add(a[i][j]);
					used[i][j] = true;
					int sum = 1;
					while (!list.isEmpty()) {
						Point st = list.get(0);
						list.remove(0);
						for (int di = -1; di <= 1; di++) {
							for (int dj = -1; dj <= 1; dj++) {
								if (di * di + dj * dj == 1) {
									if (0 <= st.i + di && st.i + di < n
											&& 0 <= st.j + dj && st.j + dj < m) {
										if (!used[st.i + di][st.j + dj]
												&& a[st.i + di][st.j + dj].value == 1) {
											used[st.i + di][st.j + dj] = true;
											list.add(a[st.i + di][st.j + dj]);
											sum++;
										}
									}
								}
							}
						}
					}
					max = Math.max(max, sum);
				}
			}
		}
		out.println(col + " " + max);
	}

	void run() {
		in = new Scanner(System.in);
		out = new PrintWriter(System.out);
		try {
			solve();
		} finally {
			out.close();
		}
	}

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

}
