#include <bits/stdc++.h>
using namespace std;
int dy[] = {1, 0, -1, 0};
int dx[] = {0, 1, 0, -1};
int N, M;
struct P {
  int y, x;
  P(int y, int x) : y(y), x(x) {}
  P() {}
  bool is_valid() { return 0 <= y && y < N && 0 <= x && x < M; }
};
vector<P> nextto[4][5020];
vector<P> nextcopy[4][5020];
string field[5020];
void remove(int i, int j) {
  for (int r = 0; r < (int)(4); ++r) {
    int r1 = r, r2 = (r + 2) % 4;
    P p1 = nextto[r1][i][j], p2 = nextto[r2][i][j];
    if (p1.is_valid()) nextto[r2][p1.y][p1.x] = p2;
    if (p2.is_valid()) nextto[r1][p2.y][p2.x] = p1;
  }
}
int doit2(int cy, int cx) {
  P p = P(cy, cx);
  char d = '*';
  int res = 0;
  for (;;) {
    if (!p.is_valid()) break;
    d = field[p.y][p.x];
    res++;
    int did = -1;
    if (d == 'D') did = 0;
    if (d == 'R') did = 1;
    if (d == 'U') did = 2;
    if (d == 'L') did = 3;
    P nextp = nextto[did][p.y][p.x];
    remove(p.y, p.x);
    p = nextp;
  }
  return res;
}
int main() {
  while (cin >> N >> M) {
    for (int i = 0; i < (int)(N); ++i) {
      cin >> field[i];
      for (int r = 0; r < (int)(4); ++r) {
        nextto[r][i] = vector<P>(M);
        for (int j = 0; j < (int)(M); ++j)
          nextto[r][i][j] = P(i + dy[r], j + dx[r]);
      }
    }
    for (int i = 0; i < (int)(N); ++i)
      for (int j = 0; j < (int)(M); ++j)
        if (field[i][j] == '.') remove(i, j);
    for (int r = 0; r < (int)(4); ++r)
      for (int k = 0; k < (int)(N); ++k) nextcopy[r][k] = nextto[r][k];
    int res1 = 0, res2 = 0;
    for (int i = 0; i < (int)(N); ++i)
      for (int j = 0; j < (int)(M); ++j)
        if (field[i][j] != '.') {
          for (int r = 0; r < (int)(4); ++r)
            for (int k = 0; k < (int)(N); ++k) nextto[r][k] = nextcopy[r][k];
          int cur = doit2(i, j);
          if (cur > res1) res1 = cur, res2 = 0;
          if (cur == res1) res2++;
        }
    cout << res1 << " " << res2 << endl;
  }
}
