module mod_que
    type queue
        integer,pointer:: v(:)
        integer(4):: i=0
    end type
contains
    subroutine que_init(q)
        type(queue):: q
        allocate(q%v(1))
    end subroutine

    subroutine que(q,num)
        type(queue):: q
        integer(4):: num

        q%i=q%i+1
        if (q%i > size(q%v)) call add(q)
        q%v(q%i) = num
    end subroutine

    subroutine add(q)
        type(queue):: q
        integer(4),pointer:: tmp(:)
        integer(4):: l

        l = size(q%v)
        allocate(tmp(l))
        tmp(1:l) = q%v(1:l)
        deallocate(q%v)
        allocate(q%v(2*l))
        q%v(1:l) = tmp(1:l)
        deallocate(tmp)
    end subroutine

    function deque(q) result(ret)
        type(queue):: q
        integer(4):: ret

        ret = q%v(1)
        q%i=q%i-1
        q%v(1:q%i) = q%v(2:q%i+1)
    end function
end module mod_que


program name
    use mod_que
    implicit none
    integer(4):: h,w
    integer(4),allocatable:: dtc(:,:)
    integer(4):: i,j, nx,ny, dx,dy
    integer(4):: black_num
    character(1),allocatable:: c(:,:)
    character(:),allocatable:: inpt_c
    type(queue):: x,y
    call que_init(x)
    call que_init(y)
    read*, h,w

    allocate(dtc(w,h), c(0:w+1,0:h+1))
    allocate(character(w):: inpt_c)
    black_num = 0
    do i=1,h
        read*, inpt_c(:)
        do j=1,w
            c(j,i) = inpt_c(j:j)
            if (c(j,i) == '#') black_num=black_num+1
        end do
    end do

    c(:,0) = '#'
    c(:,h+1) = '#'
    c(0,:) = '#'
    c(w+1,:) = '#'

    call que(x,1)
    call que(y,1)
    dtc(:,:) = -1
    dtc(1,1) = 1

    do while(x%i > 0)
        nx = deque(x)
        ny = deque(y)
        do dx=-1,1
            do dy=-1,1
                if (abs(dx) == abs(dy)) cycle
                if (c(nx+dx,ny+dy) == '#') cycle
                if (dtc(nx+dx, ny+dy) == -1) then
                    call que(x,nx+dx)
                    call que(y,ny+dy)
                    dtc(nx+dx,ny+dy) = dtc(nx,ny)+1
                else if (dtc(nx+dx,ny+dy) > dtc(nx,ny)+1) then
                    call que(x,nx+dx)
                    call que(y,ny+dy)
                    dtc(nx+dx,ny+dy) = dtc(nx,ny)+1
                end if
            end do
        end do
    end do

    if (dtc(w,h) == -1) then
        print*, -1
    else
        print*, w*h - dtc(w,h) - black_num
    end if
end program name