// Arup Guha
// Solution to Decmber 2014 USACO Bronze Problem: Crosswords

import java.util.*;
import java.io.*;
public class crosswords {

	public static int R;
	public static int C;

	public static void main(String[] args) throws Exception {

		Scanner fin = new Scanner(new File("crosswords.in"));
		PrintWriter fout = new PrintWriter("crosswords.out");

		// Read in grid.
		R = fin.nextInt();
		C = fin.nextInt();
		char[][] grid = new char[R][];
		for (int i=0; i<R; i++)
			grid[i] = fin.next().toCharArray();

		// Find valid squares.
		boolean[][] startClue = new boolean[R][C];
		int clues = 0;
		for (int i=0; i<R; i++) {
			for (int j=0; j<C; j++) {
				if (isStart(grid, i, j)) {
					startClue[i][j] = true;
					clues++;
				}
			}
		}

		// First line of output.
		fout.println(clues);

		// Print each position that is valid
		int cnt = 1;
		for (int i=0; i<R; i++)
			for (int j=0; j<C; j++)
				if (startClue[i][j])
					fout.println((i+1)+" "+(j+1));

		fin.close();
		fout.close();
	}

	// Returns true iff (x,y) is a valid starting position in grid.
	public static boolean isStart(char[][] grid, int x, int y) {
		if (grid[x][y] != '.') return false;
		if ((y == 0 || grid[x][y-1] == '#') && y < C-2 && grid[x][y+1] == '.' && grid[x][y+2] == '.') return true;
		if ((x == 0 || grid[x-1][y] == '#') && x < R-2 && grid[x+1][y] == '.' && grid[x+2][y] == '.') return true;
		return false;
	}
}

