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 M = 5000 + 5;
const long long inf = 0x7fffffff;
int n, m, maxV, num;
char a[M][M];
bool vis[M][M];
int ans[M][M];
int dfs(int x, int y) {
  if (ans[x][y] != -1) return ans[x][y];
  vis[x][y] = true;
  bool f = false;
  if (a[x][y] == 'U') {
    for (int k = 1; k <= x; k++) {
      int xx = x - k;
      if (vis[xx][y] == false && a[xx][y] != '.') {
        f = true;
        vis[xx][y] = true;
        ans[x][y] = 1 + dfs(xx, y);
      }
      if (f) break;
    }
  } else if (a[x][y] == 'D') {
    for (int k = 1; k + x < n; k++) {
      int xx = x + k;
      if (vis[xx][y] == false && a[xx][y] != '.') {
        f = true;
        vis[xx][y] = true;
        ans[x][y] = 1 + dfs(xx, y);
      }
      if (f) break;
    }
  } else if (a[x][y] == 'L') {
    for (int k = 1; k <= y; k++) {
      int yy = y - k;
      if (vis[x][yy] == false && a[x][yy] != '.') {
        f = true;
        vis[x][yy] = true;
        ans[x][y] = 1 + dfs(x, yy);
      }
      if (f) break;
    }
  } else if (a[x][y] == 'R') {
    for (int k = 1; k + y < m; k++) {
      int yy = y + k;
      if (vis[x][yy] == false && a[x][yy] != '.') {
        f = true;
        vis[x][yy] = true;
        ans[x][y] = 1 + dfs(x, yy);
      }
      if (f) break;
    }
  }
  if (f == false) {
    return 1;
  } else {
    return ans[x][y];
  }
}
int main() {
  memset(ans, -1, sizeof(ans));
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%s", a[i]);
  }
  maxV = -inf;
  num = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (a[i][j] == '.') continue;
      memset(vis, false, sizeof(vis));
      ans[i][j] = dfs(i, j);
      if (ans[i][j] > maxV) {
        maxV = ans[i][j];
        num = 1;
      } else if (ans[i][j] == maxV) {
        num++;
      }
    }
  }
  int maxV2 = -inf, num2 = 0;
  memset(ans, -1, sizeof(ans));
  for (int i = n - 1; i > 0; i--) {
    for (int j = m - 1; j > 0; j--) {
      if (a[i][j] == '.') continue;
      memset(vis, false, sizeof(vis));
      ans[i][j] = dfs(i, j);
      if (ans[i][j] > maxV2) {
        maxV2 = ans[i][j];
        num2 = 1;
      } else if (ans[i][j] == maxV2) {
        num2++;
      }
    }
  }
  if (maxV2 > maxV) {
    maxV = maxV2;
    num = num2;
  }
  printf("%d %d\n", maxV, num);
  return 0;
}
