#include <bits/stdc++.h>
using namespace std;
int const DX[] = {0, -1, 0, 1};
int const DY[] = {-1, 0, 1, 0};
string const DIRS = "ULDR";
int main() {
  cin.sync_with_stdio(false);
  cout.sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  vector<string> table(n);
  for (int i = (0); i < ((n)); ++i) cin >> table[i];
  vector<vector<pair<int, int> > > levels[4];
  for (int dir = (0); dir < ((4)); ++dir)
    levels[dir].resize(n, vector<pair<int, int> >(m, make_pair(-1, -1)));
  for (int j = (0); j < ((m)); ++j) {
    for (int i = (0); i < ((n - 1)); ++i) {
      if (table[i][j] == '.')
        levels[0][i + 1][j] = levels[0][i][j];
      else
        levels[0][i + 1][j] = make_pair(i, j);
    }
    for (int i = n - 1; i > 0; --i) {
      if (table[i][j] == '.')
        levels[2][i - 1][j] = levels[2][i][j];
      else
        levels[2][i - 1][j] = make_pair(i, j);
    }
  }
  for (int i = (0); i < ((n)); ++i) {
    for (int j = (0); j < ((m - 1)); ++j) {
      if (table[i][j] == '.')
        levels[1][i][j + 1] = levels[1][i][j];
      else
        levels[1][i][j + 1] = make_pair(i, j);
    }
    for (int j = m - 1; j > 0; --j) {
      if (table[i][j] == '.')
        levels[3][i][j - 1] = levels[3][i][j];
      else
        levels[3][i][j - 1] = make_pair(i, j);
    }
  }
  vector<vector<pair<int, int> > > tempLevels[4];
  int best = 0;
  int count = 0;
  for (int i = (0); i < ((n)); ++i)
    for (int j = (0); j < ((m)); ++j)
      if (table[i][j] != '.') {
        for (int i = (0); i < ((4)); ++i) tempLevels[i] = levels[i];
        int current = 0;
        pair<int, int> pos = make_pair(i, j);
        while (pos != make_pair(-1, -1)) {
          int currentDir = DIRS.find(table[pos.first][pos.second]);
          const pair<int, int>& left = levels[1][pos.first][pos.second];
          const pair<int, int>& right = levels[3][pos.first][pos.second];
          const pair<int, int>& up = levels[0][pos.first][pos.second];
          const pair<int, int>& down = levels[2][pos.first][pos.second];
          if (left.first > -1) levels[3][left.first][left.second] = right;
          if (right.first > -1) levels[1][right.first][right.second] = left;
          if (up.first > -1) levels[2][up.first][up.second] = down;
          if (down.first > -1) levels[0][down.first][down.second] = up;
          pos = levels[currentDir][pos.first][pos.second];
          ++current;
        }
        if (best < current) {
          best = current;
          count = 1;
        } else if (best == current) {
          ++count;
        }
        for (int i = (0); i < ((4)); ++i) levels[i] = tempLevels[i];
      }
  cout << best << " " << count << endl;
  return 0;
}
