10 10
.L.....R..
.........U
..D....D..
.R......L.
....L.....
.........D
......U...
D....R....
...U......
........L.
 5 5
DD..D
.....
LU...
U...U
.UL.U
 1 1
U
 5 5
UD..L
RRD..
..RDD
UUL..
DDLRR
 19 23
U..U..R........L...D...
.D.....UL.U.U........DR
..D.U..D....L......R...
D.......RL.L....D.....R
U..D.....U...U.L..D...U
...........L...........
U....U....D.U......LRR.
......RL...U...L.......
DLU..U......UU.U.U.D...
...........D....U......
U...DL......LL.....R...
...U..DD..........LD...
.R.........D.....UU...U
....D......R..........D
.L..........R.....L....
.R........L.LL....R....
..R...D........R....D..
.LR.R..LDU.DDRL......U.
...LL.....D.....DD.....
 11 29
URRUUDDLURLRDDLLRLDUDR.UDLLD.
LRRUDLUDLDULUDL.DURDRR.RRLLRR
D.DUDDURLRDDULDUDDUDDURRDLD.L
.RULURURRDLRRRLUUUU.RDLDLRRRL
.RLDDU.UUULUURURRLLUU.RLDRDUD
LRL.URRRDDURUURUDRRDLDDULRDRL
RLULDU.LRDUDRLDLRDDDDRUUDRDLL
DLUDURRDDUDLLDLLUURLDRUURRLUL
L.RRURRDDRRURRRDDUDRRDULR.LUR
LDLRULURRUULRDUUULLU.LLU.LLLL
DUURDULDDUDLRUUDRUULURLD.RL.U
 2 2
RD
UL
 1 10
LLLLLRRRRR
 3 3
...
...
..R
 17 13
...LD.UR.RUU.
LDLULDUDRRDRL
DD.RRLRUR.UD.
RU...D...LD..
.UR.R...URUUD
.RURD.RLR.D.R
.UUU.RU...UR.
UUUU.R.......
RL.LRU.UD.DUD
LD.DRURRLRDRL
.DR..UULUDDR.
LRLURRUUDDLUR
.LRDDLLR.L.DU
DRUDLLD.LRRU.
..DL.UDL.DUL.
U.DL..D..U.RD
RR.R...RL.L..

2 2
 4 1
 1 1
 8 3
 9 1
 94 1
 4 4
 5 2
 1 1
 24 2

#include <bits/stdc++.h>
using namespace std;
const int maxn = 5000 + 2;
int n, m;
char board[maxn][maxn];
int left[maxn], right[maxn], up[maxn], down[maxn];
int ll[maxn], rr[maxn], uu[maxn], dd[maxn];
int cal(int a, int b) { return a * m + b + 1; }
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; ++i) scanf("%s", board[i]);
  for (int row = 0; row < n; ++row) {
    int prev = 0;
    for (int col = 0; col < m; ++col) {
      left[cal(row, col)] = prev;
      if (board[row][col] != '.') prev = cal(row, col);
    }
    prev = 0;
    for (int col = m - 1; col >= 0; --col) {
      right[cal(row, col)] = prev;
      if (board[row][col] != '.') prev = cal(row, col);
    }
  }
  for (int col = 0; col < m; ++col) {
    int prev = 0;
    for (int row = 0; row < n; ++row) {
      up[cal(row, col)] = prev;
      if (board[row][col] != '.') prev = cal(row, col);
    }
    prev = 0;
    for (int row = n - 1; row >= 0; --row) {
      down[cal(row, col)] = prev;
      if (board[row][col] != '.') prev = cal(row, col);
    }
  }
  int best = 0, bestn = 0;
  for (int row = 0; row < n; ++row) {
    for (int col = 0; col < m; ++col)
      if (board[row][col] != '.') {
        for (int i = 0; i <= n * m; ++i)
          ll[i] = left[i], rr[i] = right[i], uu[i] = up[i], dd[i] = down[i];
        int pos = cal(row, col);
        int count = 0;
        while (pos != 0) {
          ++count;
          int cr = (pos - 1) / m, cc = (pos - 1) % m;
          if (ll[pos]) rr[ll[pos]] = rr[pos];
          if (rr[pos]) ll[rr[pos]] = ll[pos];
          if (uu[pos]) dd[uu[pos]] = dd[pos];
          if (dd[pos]) uu[dd[pos]] = rr[pos];
          if (board[cr][cc] == 'L')
            pos = ll[pos];
          else if (board[cr][cc] == 'R')
            pos = rr[pos];
          else if (board[cr][cc] == 'U')
            pos = uu[pos];
          else if (board[cr][cc] == 'D')
            pos = dd[pos];
        }
        if (count == best)
          bestn++;
        else if (count > best)
          best = count, bestn = 1;
      }
  }
  printf("%d %d\n", best, bestn);
  return 0;
}
