using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Schema;
using static System.Console;

namespace ConsoleApp2
{
    class Program
    {
        static public int[] Sarray() { return ReadLine().Split().Select(int.Parse).ToArray(); }
        static public List<int> Slist() { return new List<int>(ReadLine().Split().Select(int.Parse)); }
        static void Main(string[] args)
        {
            var HW = Sarray();
            var H = HW[0];
            var W = HW[1];
            var map = new char[H][];
            var memo = new int[H,W];
            for (var i=0;i<H;i++)
            {
                map[i] = ReadLine().ToCharArray();
            }
            var bc = 0;
            for (var i = 0; i < H; i++)
            {
                for (var j = 0; j < W; j++)
                {
                    if (map[i][j] == '#') bc++;
                }
            }

            var q = new Queue<List<int>>();
            q.Enqueue(new List<int> { 0, 0});
            var rc = 0;
            while (q.Any())
            {
                var item = q.Dequeue();
                if(item[0]==H-1&& item[1] == W-1)
                {
                    rc = memo[item[0], item[1]];
                    break;
                }
                if (item[0] <0|| H<=item[0] || item[1]<0||W<= item[1] || map[item[0]][item[1]] == '#') continue;
                if (0<=item[0] - 1 && item[0] - 1 < H &&
                    memo[item[0] - 1, item[1]] == 0)
                {
                    q.Enqueue(new List<int> { item[0]-1, item[1] });
                    memo[item[0] - 1, item[1]] = memo[item[0], item[1]] + 1;
                }
                if (0 <= item[0] + 1 && item[0] + 1 < H &&
                    memo[item[0] + 1, item[1]] == 0)
                {
                    q.Enqueue(new List<int> { item[0]+1, item[1] });
                    memo[item[0] + 1, item[1]] = memo[item[0], item[1]] + 1;
                }
                if (0 <= item[1] - 1 && item[1] - 1 < W &&
                    memo[item[0], item[1] - 1] == 0)
                {
                    q.Enqueue(new List<int> { item[0], item[1]-1 });
                    memo[item[0], item[1] - 1] = memo[item[0], item[1]] + 1;
                }
                if (0 <= item[1] + 1 && item[1] + 1 < W &&
                    memo[item[0], item[1] + 1] == 0)
                {
                    q.Enqueue(new List<int> { item[0], item[1]+1 });
                    memo[item[0], item[1] + 1] = memo[item[0], item[1]] + 1;
                }
            }
            if(rc==0)
            {
                WriteLine(-1);
                return;
            }

            //var ans = 0;
            //for(var k =0;k<=rc;k++)
            //{
            //    var tmp = 0;
            //    for (var i = 0; i < H; i++)
            //    {
            //        for (var j = 0; j < W; j++)
            //        {
            //            if (memo[i, j] == k) tmp++;
            //        }
            //    }
            //    ans += tmp - 1;
            //}
            WriteLine(H*W-1-rc-bc);
        }
    }
}

Measured memory_bytes: 19228