#include <bits/stdc++.h>   using namespace std;   void err(istream_iterator<string> it) {}   template <typename T, typename... Args>   void err(istream_iterator<string> it, T a, Args... args) {     cerr << *it <<   =   << a << endl;     err(++it, args...);   }   long long mod = 1e9 + 7;   long long powm(long long a, long long b, long long mod) {     long long res = 1;     while (b) {       if (b & 1) res = (res * a) % mod;       a = (a * a) % mod;       b >>= 1;     }     return res;   }   bool sortinrev(const pair<int, int> &a, const pair<int, int> &b) {     return (a.first > b.first);   }   void solve() {     int n, m;     cin >> n >> m;     string s[n];     for (long long i = 0; i < (n); i++) cin >> s[i];     int mat1[n][m];     int mat2[n][m];     int mat3[n][m];     int mat4[n][m];     memset(mat1, 0, sizeof(mat1));     memset(mat2, 0, sizeof(mat2));     memset(mat3, 0, sizeof(mat3));     memset(mat4, 0, sizeof(mat4));     for (long long i = 0; i < (n); i++) {       for (long long j = 0; j < (m); j++) {         if (s[i][j] ==  * ) {           if (j - 1 >= 0)             mat1[i][j] += 1 + mat1[i][j - 1];           else             mat1[i][j] = 1;         }       }     }     for (long long i = 0; i < (n); i++) {       for (long long j = (m)-1; j >= 0; j--) {         if (s[i][j] ==  * ) {           if (j + 1 < m)             mat2[i][j] += 1 + mat2[i][j + 1];           else             mat2[i][j] = 1;         }       }     }     for (long long j = 0; j < (m); j++) {       for (long long i = 0; i < (n); i++) {         if (s[i][j] ==  * ) {           if (i - 1 >= 0)             mat3[i][j] += 1 + mat3[i - 1][j];           else             mat3[i][j] = 1;         }       }     }     for (long long j = 0; j < (m); j++) {       for (long long i = (n)-1; i >= 0; i--) {         if (s[i][j] ==  * ) {           if (i + 1 < n)             mat4[i][j] += 1 + mat4[i + 1][j];           else             mat4[i][j] = 1;         }       }     }     int temp_mat2[n + 1][m + 1];     int temp_mat1[n + 1][m + 1];     memset(temp_mat1, 0, sizeof(temp_mat1));     memset(temp_mat2, 0, sizeof(temp_mat2));     vector<tuple<int, int, int> > v;     for (long long i = 0; i < (n); i++) {       for (long long j = 0; j < (m); j++) {         if (mat1[i][j] > 1 and mat2[i][j] > 1 and mat3[i][j] > 1 and             mat4[i][j] > 1) {           temp_mat1[i][j - min({mat1[i][j], mat2[i][j], mat3[i][j], mat4[i][j]}) +                        1]++;           temp_mat1[i]                    [j + min({mat1[i][j], mat2[i][j], mat3[i][j], mat4[i][j]})]--;           temp_mat2[i - min({mat1[i][j], mat2[i][j], mat3[i][j], mat4[i][j]}) + 1]                    [j]++;           temp_mat2[i + min({mat1[i][j], mat2[i][j], mat3[i][j], mat4[i][j]})]                    [j]--;           v.push_back(make_tuple(               i + 1, j + 1,               min({mat1[i][j], mat2[i][j], mat3[i][j], mat4[i][j]}) - 1));         }       }     }     for (long long i = 0; i < (n); i++) {       for (long long j = 0; j < (m); j++) {         if (j > 0) temp_mat1[i][j] += temp_mat1[i][j - 1];       }     }     for (long long j = 0; j < (m); j++) {       for (long long i = 0; i < (n); i++) {         if (i > 0) temp_mat2[i][j] += temp_mat2[i - 1][j];       }     }     for (long long i = 0; i < (n); i++) {       for (long long j = 0; j < (m); j++) {         if (s[i][j] ==  * ) {           if (temp_mat1[i][j] == 0 and temp_mat2[i][j] == 0) {             cout << -1 << endl;             return;           }         }       }     }     cout << v.size() << endl;     for (long long i = 0; i < (v.size()); i++) {       cout << (get<0>(v[i])) <<     << (get<1>(v[i])) <<     << (get<2>(v[i]))            << endl;     }   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     solve();   }