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>
#pragma comment(linker, "/STACK:64000000")
using namespace std;
const int INF = (int)1E9;
const long long INF64 = (long long)1E18;
const long double EPS = 1E-8;
const long double PI = 3.1415926535897932384626433832795;
const int MAXN = 10100;
int n, m;
int u[MAXN], d[MAXN], l[MAXN], r[MAXN];
int U[MAXN], D[MAXN], L[MAXN], R[MAXN];
char c[MAXN];
int get(int x, int y) {
  if (0 <= x && x < n && 0 <= y && y < m) return x * m + y;
  return INF;
}
int leader(int *l, int v) {
  if (v > INF / 2) return INF;
  if (l[v] != v) l[v] = leader(l, l[v]);
  return l[v];
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < (int)(n); i++)
    for (int j = 0; j < (int)(m); j++) {
      int v = get(i, j);
      scanf(" %c", &c[v]);
    }
  int ans = 0, cnt = 0;
  for (int i = 0; i < (int)(n * m); i++) {
    for (int j = 0; j < (int)(n * m); j++) {
      int x = j / m, y = j % m;
      u[j] = d[j] = l[j] = r[j] = j;
      if (c[j] == '.') {
        d[j] = get(x + 1, y);
        u[j] = get(x - 1, y);
        l[j] = get(x, y - 1);
        r[j] = get(x, y + 1);
      }
    }
    int v = i, cur = 0;
    while (true) {
      if (v > INF / 2 || c[v] == '.') break;
      cur++;
      int x = v / m, y = v % m, nv = INF;
      d[v] = get(x + 1, y);
      u[v] = get(x - 1, y);
      l[v] = get(x, y - 1);
      r[v] = get(x, y + 1);
      if (c[v] == 'D') nv = leader(d, v);
      if (c[v] == 'U') nv = leader(u, v);
      if (c[v] == 'L') nv = leader(l, v);
      if (c[v] == 'R') nv = leader(r, v);
      v = nv;
    }
    if (cur > ans) {
      ans = cur;
      cnt = 0;
    }
    if (cur == ans) cnt++;
  }
  cout << ans << " " << cnt << endl;
  return 0;
}
