using System;
using System.Linq;

namespace Takmicenje_3
{
    internal class Program
    {
        static void SirenjeVatre(Polje[,] Tabla, int m, int n, ref int brojac, ref bool PromenaTable)
        {
            brojac++;
            Polje[,] NovaTabla = new Polje[m, n];
            Array.Copy(Tabla, NovaTabla, Tabla.Length);

            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (Tabla[i, j].stanje == StanjePolja.Vatra)
                    {
                        SirenjeVatre_(Tabla, NovaTabla, i, j, m, n, brojac);
                    }
                }
            }

            bool Ugasi = true;
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (Tabla[i, j].stanje != NovaTabla[i, j].stanje)
                        Ugasi = false;
                }
            }

            PromenaTable = !Ugasi;

            Array.Copy(NovaTabla, Tabla, Tabla.Length);
        }

        static void SirenjeVatre_(Polje[,] Tabla, Polje[,] NovaTabla, int i, int j, int m, int n, int brojac)
        {
            if (i > 0 && (Tabla[i - 1, j].stanje == StanjePolja.Slobodno || Tabla[i - 1, j].stanje == StanjePolja.Steva))
            {
                NovaTabla[i - 1, j].stanje = StanjePolja.Vatra;
                NovaTabla[i - 1, j].UdaljenostOdVatre = brojac;
            }
            if (i < m - 1 && (Tabla[i + 1, j].stanje == StanjePolja.Slobodno || Tabla[i + 1, j].stanje == StanjePolja.Steva))
            {
                NovaTabla[i + 1, j].stanje = StanjePolja.Vatra;
                NovaTabla[i + 1, j].UdaljenostOdVatre = brojac;
            }
            if (j > 0 && (Tabla[i, j - 1].stanje == StanjePolja.Slobodno || Tabla[i, j - 1].stanje == StanjePolja.Steva))
            {
                NovaTabla[i, j - 1].stanje = StanjePolja.Vatra;
                NovaTabla[i, j - 1].UdaljenostOdVatre = brojac;
            }
            if (j < n - 1 && (Tabla[i, j + 1].stanje == StanjePolja.Slobodno || Tabla[i, j + 1].stanje == StanjePolja.Steva))
            {
                NovaTabla[i, j + 1].stanje = StanjePolja.Vatra;
                NovaTabla[i, j + 1].UdaljenostOdVatre = brojac;
            }
        }


        static void SirenjeSteve(Polje[,] Tabla, int m, int n, ref int brojac, ref bool PromenaTable)
        {
            brojac++;
            Polje[,] NovaTabla = new Polje[m, n];
            Array.Copy(Tabla, NovaTabla, Tabla.Length);

            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (Tabla[i, j].stanje == StanjePolja.Steva)
                    {
                        SirenjeSteve_(Tabla, NovaTabla, i, j, m, n, brojac);
                    }
                }
            }

            bool Ugasi = true;
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (Tabla[i, j].stanje != NovaTabla[i, j].stanje)
                        Ugasi = false;
                }
            }

            PromenaTable = !Ugasi;
            Array.Copy(NovaTabla, Tabla, Tabla.Length);
        }

        static void SirenjeSteve_(Polje[,] Tabla, Polje[,] NovaTabla, int i, int j, int m, int n, int brojac)
        {
            if (i > 0 && (Tabla[i - 1, j].stanje == StanjePolja.Slobodno || Tabla[i - 1, j].stanje == StanjePolja.Vatra))
            {
                NovaTabla[i - 1, j].stanje = StanjePolja.Steva;
                NovaTabla[i - 1, j].UdaljenostOdSteve = brojac;
            }
            if (i < m - 1 && (Tabla[i + 1, j].stanje == StanjePolja.Slobodno || Tabla[i + 1, j].stanje == StanjePolja.Vatra))
            {
                NovaTabla[i + 1, j].stanje = StanjePolja.Steva;
                NovaTabla[i + 1, j].UdaljenostOdSteve = brojac;
            }
            if (j > 0 && (Tabla[i, j - 1].stanje == StanjePolja.Slobodno || Tabla[i, j - 1].stanje == StanjePolja.Vatra))
            {
                NovaTabla[i, j - 1].stanje = StanjePolja.Steva;
                NovaTabla[i, j - 1].UdaljenostOdSteve = brojac;
            }
            if (j < n - 1 && (Tabla[i, j + 1].stanje == StanjePolja.Slobodno || Tabla[i, j + 1].stanje == StanjePolja.Vatra))
            {
                NovaTabla[i, j + 1].stanje = StanjePolja.Steva;
                NovaTabla[i, j + 1].UdaljenostOdSteve = brojac;
            }
        }

        static void Main(string[] args)
        {
            string s = Console.ReadLine().Trim();
            int m = int.Parse(s.Split()[0]);
            int n = int.Parse(s.Split()[1]);
            Polje[,] Tabla = new Polje[m, n];

            for (int i = 0; i < m; i++)
            {
                s = Console.ReadLine().Trim();
                char[] red = s.ToCharArray();
                for (int j = 0; j < red.Length; j++)
                {
                    switch (red[j])
                    {
                        case '*':
                            Tabla[i, j].stanje = StanjePolja.Zid;
                            break;
                        case '.':
                            Tabla[i, j].stanje = StanjePolja.Slobodno;
                            break;
                        case 'S':
                            Tabla[i, j].stanje = StanjePolja.Steva;
                            break;
                        case 'X':
                            Tabla[i, j].stanje = StanjePolja.Vatra;
                            break;
                    }
                }
            }

            Polje[,] NovaTabla = new Polje[m, n];
            Array.Copy(Tabla, NovaTabla, Tabla.Length);

            int brojac = 0;
            bool PromenaTable = true;

            while (PromenaTable)
            {
                SirenjeVatre(NovaTabla, m, n, ref brojac, ref PromenaTable);
            }

            brojac = 0;
            PromenaTable = true;
            while (PromenaTable)
            {
                SirenjeSteve(Tabla, m, n, ref brojac, ref PromenaTable);
            }

            brojac = 0;
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (Tabla[i, j].UdaljenostOdSteve < NovaTabla[i, j].UdaljenostOdVatre)
                        brojac++;
                }
            }
            Console.WriteLine(brojac);
            Console.ReadLine();
        }

        struct Polje
        {
            public StanjePolja stanje;
            public int UdaljenostOdSteve;
            public int UdaljenostOdVatre;
        }

        enum StanjePolja
        {
            Zid,
            Vatra,
            Slobodno,
            Steva
        }
    }
}