#include<bits/stdc++.h>
using namespace std;
int n, m, vatra_vel, steva_vel, prazno;
int vatra_br, steva_br;
char mat[1010][1010];
struct slog
{
   int x;
   int y;
};
slog dodaj, obradi;
queue<slog> vatra;
queue<slog> steva;

void ISPIS()
{
   prazno = 0;
   for(int i=1; i<=n; i++)
   {
      for(int j=1; j<=m; j++)
      {
         if(mat[i][j] == 'S')
            prazno++;
      }
   }
   //cout << endl;
}

void UNOS()
{
   cin >> n >> m;
   for(int i=1; i<=n; i++)
   {
      for(int j=1; j<=m; j++)
      {
         cin >> mat[i][j];
         if(mat[i][j] == 'S')
         {
            dodaj.x = i;
            dodaj.y = j;
            steva.push(dodaj);
         }

         if(mat[i][j] == 'X')
         {
            dodaj.x = i;
            dodaj.y = j;
            vatra.push(dodaj);
         }

         if(mat[i][j] == '.')
            prazno++;
      }
   }
}

int main()
{
   //ios_base::sync_with_stdio(false);
   //cin.tie(NULL);
   memset(mat, '*', sizeof(mat));

   UNOS();
   //cout << endl;

   while(vatra.size() > 0 or steva.size() > 0)
   {
      vatra_vel = vatra.size();
      steva_vel = steva.size();
      vatra_br = 0;
      steva_br = 0;
      //cout << steva_vel << endl;
      while(vatra_br < vatra_vel)
      {
         obradi = vatra.front();
         if(mat[obradi.x+1][obradi.y] == '.') /// ONDA MOZE
         {
            dodaj.x = obradi.x+1;
            dodaj.y = obradi.y;
            mat[dodaj.x][dodaj.y] = 'X';
            vatra.push(dodaj);

            //cout << dodaj.x << " " << dodaj.y << "\n";

            prazno--;
         }

         if(mat[obradi.x-1][obradi.y] == '.') /// ONDA MOZE
         {
            dodaj.x = obradi.x-1;
            dodaj.y = obradi.y;
            mat[dodaj.x][dodaj.y] = 'X';
            vatra.push(dodaj);
            //cout << dodaj.x << " " << dodaj.y << "\n";
            prazno--;
         }

         if(mat[obradi.x][obradi.y+1] == '.') /// ONDA MOZE
         {
            dodaj.x = obradi.x;
            dodaj.y = obradi.y+1;
            mat[dodaj.x][dodaj.y] = 'X';
            vatra.push(dodaj);
            //cout << dodaj.x << " " << dodaj.y << "\n";
            prazno--;
         }

         if(mat[obradi.x][obradi.y-1] == '.') /// ONDA MOZE
         {
            dodaj.x = obradi.x;
            dodaj.y = obradi.y-1;
            mat[dodaj.x][dodaj.y] = 'X';
            vatra.push(dodaj);
            //cout << dodaj.x << " " << dodaj.y << "\n";
            prazno--;
         }

         vatra.pop();
         vatra_br++;
      }

      while(steva_br < steva_vel)
      {
         obradi = steva.front();

         if(mat[obradi.x+1][obradi.y] == '.') /// ONDA MOZE
         {
            dodaj.x = obradi.x+1;
            dodaj.y = obradi.y;
            mat[dodaj.x][dodaj.y] = 'S';
            steva.push(dodaj);
            //cout << dodaj.x << " " << dodaj.y << "\n";
            prazno--;
         }

         if(mat[obradi.x-1][obradi.y] == '.') /// ONDA MOZE
         {
            dodaj.x = obradi.x-1;
            dodaj.y = obradi.y;
            mat[dodaj.x][dodaj.y] = 'S';
            steva.push(dodaj);
            //cout << dodaj.x << " " << dodaj.y << "\n";
            prazno--;
         }

         if(mat[obradi.x][obradi.y+1] == '.') /// ONDA MOZE
         {
            dodaj.x = obradi.x;
            dodaj.y = obradi.y+1;
            mat[dodaj.x][dodaj.y] = 'S';
            steva.push(dodaj);
            //cout << dodaj.x << " " << dodaj.y << "\n";
            prazno--;
         }

         if(mat[obradi.x][obradi.y-1] == '.') /// ONDA MOZE
         {
            dodaj.x = obradi.x;
            dodaj.y = obradi.y-1;
            mat[dodaj.x][dodaj.y] = 'S';
            steva.push(dodaj);
            //cout << dodaj.x << " " << dodaj.y << "\n";
            prazno--;
         }

         steva.pop();
         steva_br++;
      }

      //ISPIS();
   }
   ISPIS();
   cout << prazno << "\n";
   return 0;
}