Problem: A mouse encountered a nice big cake and decided to take a walk across it, eating the berries on top of the cake on its way. The cake is rectangular, neatly divided into squares; some of the squares have a berry in them, and some don't.

The mouse is in a bit of a hurry, though, so once she enters the cake from its northwest corner (the top left cell in the input data), she will only go east (right) or south (down), until she reaches the southeast corner (the bottom right cell). She will eat every berry in the squares she passes through, but not in the other squares.

The mouse tries to choose her path so as to maximize the number of berries consumed. However, her haste and hunger might be clouding her judgement, leading her to suboptimal decisions...

Input

The first line of input contains two integers H and W (1 ≤ H, W ≤ 5), separated by a space, — the height and the width of the cake.

The next H lines contain a string of W characters each, representing the squares of the cake in that row: '.' represents an empty square, and '*' represents a square with a berry.

Output

Output the number of berries the mouse will eat following her strategy.

Examples

Input


4 3
*..
.*.
..*
...


Output


3


Input


4 4
.*..
*...
...*
..*.


Output


2


Input


3 4
..**
*...
....


Output


1


Input


5 5
..*..
.....
**...
**...
**...


Output


1

Solution (in CPP):

Solution:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
#include <string>
using namespace std;
typedef long long ll;
#define For(i, a, b) for (int i = a; i < b; ++i)
#define Forr(i, a, b) for (int i = b - 1; i >= a; --i)
#define Min(a, b) (a < b ? a : b)
#define Max(a, b) (a > b ? a : b)
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define Sort(x) sort(x.begin(), x.end())
#define Sortr(x) sort(x.rbegin(), x.rend())
#define vpi vector<pair<int, int>>
#define vpl vector<pair<ll, ll>>
#define mp make_pair

// Conditions for a valid cell
bool IsValid(vector<vector<bool>> &visited, int row, int col)
{
    // Check if cell is out of bounds
    if (row < 0 || col < 0 || row >= visited.size() || col >= visited[0].size())
    {
        return false;
    }

    // Check if cell is already visited
    if (visited[row][col])
    {
        return false;
    }

    return true;
}

pair<int, int> BreadthFirstSearch(vector<string> &grid, vector<vector<bool>> &visited, int irow, int icol)
{
    // Enqueue the initial cell
    queue<pair<int, int>> open;
    open.push(make_pair(irow, icol));
    visited[irow][icol] = true;

    while (!open.empty())
    {
        // Dequeue the cell at the front of the queue
        pair<int, int> cell = open.front();
        int row = cell.first;
        int col = cell.second;
        open.pop();

        // Exit Conditions
        if(grid[row][col] == '*')
        {
            grid[row][col] = '.';
            return cell;
        }

        // Coordinates for adjacent cells
        int drow[2] = {0, 1};
        int dcol[2] = {1, 0};

        // Add adjacent valid cells to queue
        for (int i = 0; i < 2; ++i)
        {
            int arow = row + drow[i];
            int acol = col + dcol[i];

            if (IsValid(visited, arow, acol))
            {
                open.push(make_pair(arow, acol));
                visited[arow][acol] = true;
            }
        }
    }
    return make_pair(-1, -1);
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int h, w, x=0, y=0, c=-1;
    cin >> h >> w;
    vector<string> grid(h);
    for(string &i: grid)
    {
        cin >> i;
    }
    vector< vector<bool> > visited;
    vector<bool> temp(w);
    For(i, 0, h)
    {
        visited.pb(temp);
    }
    auto temp2 = make_pair(0, 0);
    while(temp2 != make_pair(-1, -1))
    {
        temp2 = BreadthFirstSearch(grid, visited, x, y);
        ++c;
        x = temp2.first;
        y = temp2.second;
    }
    cout << c;
}