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>
int sgn(double x) {
  if (fabs(x) < 1e-9)
    return 0;
  else
    return x > 0 ? 1 : -1;
}
using namespace std;
int total;
int U[10000], D[10000], L[10000], R[10000];
int dir[10000];
int N, M, mark;
void addPoint(int r, int c, int o) {
  ++total;
  dir[total] = o;
  R[total] = r;
  L[total] = L[r];
  L[R[total]] = R[L[total]] = total;
  c += N;
  U[total] = U[c];
  D[total] = c;
  U[D[total]] = D[U[total]] = total;
}
void Remove(int p) {
  L[R[p]] = L[p];
  R[L[p]] = R[p];
  U[D[p]] = U[p];
  D[U[p]] = D[p];
}
void Resume(int p) {
  L[R[p]] = p;
  R[L[p]] = p;
  U[D[p]] = p;
  D[U[p]] = p;
}
void dfs(int v, int dep) {
  if (v <= N + M) return;
  mark = max(mark, dep);
  Remove(v);
  if (dir[v] == 0) dfs(L[v], dep + 1);
  if (dir[v] == 1) dfs(R[v], dep + 1);
  if (dir[v] == 2) dfs(U[v], dep + 1);
  if (dir[v] == 3) dfs(D[v], dep + 1);
  Resume(v);
}
int main() {
  scanf("%d%d", &N, &M);
  char str[10000];
  int o;
  for (int i = 1; i <= N; i++) L[i] = R[i] = i;
  for (int i = N + 1; i <= N + M; i++) U[i] = D[i] = i;
  total = N + M;
  for (int i = 1; i <= N; i++) {
    scanf("%s", str);
    for (int j = 1; j <= M; j++) {
      char ch = str[j - 1];
      if (ch == '.') continue;
      o = -1;
      if (ch == 'L') o = 0;
      if (ch == 'R') o = 1;
      if (ch == 'U') o = 2;
      if (ch == 'D') o = 3;
      addPoint(i, j, o);
    }
  }
  int ans = 0, cnt = 0;
  for (int i = N + M + 1; i <= total; i++) {
    mark = 0;
    dfs(i, 1);
    if (mark > ans) {
      ans = mark;
      cnt = 1;
    } else if (mark == ans)
      cnt++;
  }
  printf("%d %d\n", ans, cnt);
  for (int i = 1; i <= total; i++) {
  }
  return 0;
}
