using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Pozar
{
    internal class Program
    {
        static bool moze(int x, int y, int n, int m, char[,] l)
        {
            if (x < 0 || x >= n || y < 0 || y >= m || l[x, y] == '*')
                return false;
            return true;
        }

        static void Main(string[] args)
        {
            string[] str = Console.ReadLine().Split(' ');
            int n = int.Parse(str[0]);
            int m = int.Parse(str[1]);
            if(n == 1)
            {
                string str1 = Console.ReadLine();
                char clevo = ' ', cdesno = ' ';
                int indexclevo = 0, indexcdesno = 0, index = 0, r = 1;
                bool s_nadjen = false;
                for (int i = 0; i < m; i++)
                {
                    char c1 = str1[i];
                    if (c1 == 'S')
                    {
                        index = i;
                        s_nadjen = true;
                        continue;
                    }
                    if(!s_nadjen)
                    {
                        if (c1 == 'X')
                        {
                            clevo = 'X';
                            indexclevo = i;
                        }
                        else if(c1 == '*')
                        {
                            clevo = '*';
                            indexclevo = i;
                        }
                    }
                    if(s_nadjen)
                    {
                        if(c1 == 'X')
                        {
                            cdesno = 'X';
                            indexcdesno = i;
                            break;
                        }
                        else if(c1 == '*')
                        {
                            cdesno = '*';
                            indexcdesno = i;
                            break;
                        }
                    }
                }

                if (clevo == 'X')
                    r += (index - indexclevo - 1) / 2;
                else if (clevo == '*')
                    r += index - indexclevo - 1;
                else
                    r += index;
                if (cdesno == 'X')
                    r += (indexcdesno - index - 1) / 2;
                else if (cdesno == '*')
                    r += indexcdesno - index - 1;
                else
                    r += m - 1 - index;

                Console.WriteLine(r);
            }
            else
            {
                char[,] l = new char[n, m];
                int i1 = 0, j1 = 0, i2 = 0, j2 = 0;
                bool ima_x = true; int brzid = 0;
                for (int i = 0; i < n; i++)
                {
                    string str1 = Console.ReadLine();
                    for (int j = 0; j < m; j++)
                    {
                        l[i, j] = str1[j];
                        if (l[i, j] == 'S')
                        {
                            i1 = i;
                            j1 = j;
                        }
                        if (l[i, j] == 'X')
                        {
                            ima_x = false;
                            i2 = i;
                            j2 = j;
                        }
                        if (l[i, j] == '*')
                            brzid++;
                    }
                }

                if(ima_x)
                {
                    Console.WriteLine(n * m - brzid);
                }
                else
                {
                    List<int>[] s = new List<int>[3];
                    s[0] = new List<int>();
                    s[1] = new List<int>();
                    s[2] = new List<int>();
                    List<int>[] x = new List<int>[3];
                    x[0] = new List<int>();
                    x[1] = new List<int>();
                    x[2] = new List<int>();
                    int[,] l1 = new int[n, m];
                    l1[i1, j1] = 1;
                    s[0].Add(i1); s[1].Add(j1); s[2].Add(1);
                    l1[i2, j2] = -1;
                    x[0].Add(i2); x[1].Add(j2); x[2].Add(1);
                    int r = 1;

                    while (s[0].Count > 0)
                    {
                        int i = s[0][0], j = s[1][0], broj = s[2][0];
                        if (moze(i - 1, j, n, m, l) && l1[i - 1, j] == 0)
                        {
                            s[0].Add(i - 1);
                            s[1].Add(j);
                            s[2].Add(broj + 1);
                            l1[i - 1, j] = broj + 1;
                            r++;
                        }
                        if (moze(i, j - 1, n, m, l) && l1[i, j - 1] == 0)
                        {
                            s[0].Add(i);
                            s[1].Add(j - 1);
                            s[2].Add(broj + 1);
                            l1[i, j - 1] = broj + 1;
                            r++;
                        }
                        if (moze(i + 1, j, n, m, l) && l1[i + 1, j] == 0)
                        {
                            s[0].Add(i + 1);
                            s[1].Add(j);
                            s[2].Add(broj + 1);
                            l1[i + 1, j] = broj + 1;
                            r++;
                        }
                        if (moze(i, j + 1, n, m, l) && l1[i, j + 1] == 0)
                        {
                            s[0].Add(i);
                            s[1].Add(j + 1);
                            s[2].Add(broj + 1);
                            l1[i, j + 1] = broj + 1;
                            r++;
                        }

                        if (x[0].Count > 0)
                        {
                            i = x[0][0]; j = x[1][0]; broj = x[2][0];
                            if (moze(i - 1, j, n, m, l) && l1[i - 1, j] == 0)
                            {
                                x[0].Add(i - 1);
                                x[1].Add(j);
                                x[2].Add(broj + 1);
                                l1[i - 1, j] = -1 * (broj + 1);
                            }
                            if (moze(i, j - 1, n, m, l) && l1[i, j - 1] == 0)
                            {
                                x[0].Add(i);
                                x[1].Add(j - 1);
                                x[2].Add(broj + 1);
                                l1[i, j - 1] = -1 * (broj + 1);
                            }
                            if (moze(i + 1, j, n, m, l) && l1[i + 1, j] == 0)
                            {
                                x[0].Add(i + 1);
                                x[1].Add(j);
                                x[2].Add(broj + 1);
                                l1[i + 1, j] = -1 * (broj + 1);
                            }
                            if (moze(i, j + 1, n, m, l) && l1[i, j + 1] == 0)
                            {
                                x[0].Add(i);
                                x[1].Add(j + 1);
                                x[2].Add(broj + 1);
                                l1[i, j + 1] = -1 * (broj + 1);
                            }
                        }

                        s[0].RemoveAt(0); s[1].RemoveAt(0); s[2].RemoveAt(0);
                        if (x[0].Count > 0)
                        {
                            x[0].RemoveAt(0); 
                            x[1].RemoveAt(0); 
                            x[2].RemoveAt(0);
                        }
                            
                    }

                    Console.WriteLine(r);
                }
            }
        }
    }
}