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 = 5005;
char mat[MAXN], tmp[MAXN];
int setx[MAXN][4];
int n, m, total;
int cnt[MAXN];
static int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
inline int GetK(const char c) {
  switch (c) {
    case 'D':
      return 0;
    case 'R':
      return 1;
    case 'U':
      return 2;
    default:
      return 3;
  }
}
inline bool Inside(int x, int y) { return x >= 0 && x < n && y >= 0 && y < m; }
inline int InitSet(int No, int k) {
  int x = No / m, y = No % m;
  x += dir[k][0];
  y += dir[k][1];
  if (Inside(x, y) == false) return -1;
  return x * m + y;
}
inline int FindNext(int no, int k) {
  if (setx[no][k] == -1) return -1;
  if (mat[setx[no][k]] != '.') return setx[no][k];
  return setx[no][k] = FindNext(setx[no][k], k);
}
int Solve(int cur) {
  int ret = 0;
  while (cur != -1) {
    int nextno = FindNext(cur, GetK(mat[cur]));
    mat[cur] = '.';
    ret++;
    cur = nextno;
  }
  return ret;
  puts("");
}
int main() {
  while (cin >> n >> m) {
    memset(cnt, 0, sizeof(cnt));
    total = n * m;
    for (int i = 0; i < total; i++) {
      cin >> tmp[i];
    }
    for (int i = 0; i < total; i++) {
      if (tmp[i] == '.') continue;
      memcpy(mat, tmp, sizeof(char) * total);
      for (int j = 0; j < total; j++) {
        for (int k = 0; k < 4; k++) {
          setx[j][k] = InitSet(j, k);
        }
      }
      cnt[Solve(i)]++;
    }
    for (int i = total; i >= 0; i--) {
      if (cnt[i] > 0) {
        cout << i << ' ' << cnt[i] << endl;
        break;
      }
    }
  }
  return 0;
}
