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 oo = (int)1e9;
const double PI = 2 * acos(0.0);
const long double eps = 1e-12;
int diri[] = {-1, 0, 1, 0};
int dirk[] = {0, 1, 0, -1};
int n, m;
vector<vector<int> > maze;
struct state {
  int i, k, dir;
  state(int ii, int kk, int dirr) { i = ii, k = kk, dir = dirr; }
};
int findscore(vector<vector<int> > maz, state s) {
  if (s.i < 0 || s.i >= n || s.k < 0 || s.k >= m) return 0;
  state nxt(s.i + diri[s.dir], s.k + dirk[s.dir], s.dir);
  int cnt = 0;
  if (maz[s.i][s.k] < 4) {
    cnt = 1;
    int newd = maz[s.i][s.k];
    nxt = state(s.i + diri[newd], s.k + dirk[newd], newd);
  }
  maz[s.i][s.k] = 4;
  return findscore(maz, nxt) + cnt;
}
int main() {
  scanf("%d%d", &n, &m);
  maze = vector<vector<int> >(n, vector<int>(m));
  for (int i = ((int)0); i <= ((int)n - 1); i++) {
    string line;
    cin >> line;
    for (int k = ((int)0); k <= ((int)m - 1); k++) {
      switch (line[k]) {
        case 'U': {
          maze[i][k] = 0;
          break;
        }
        case 'R': {
          maze[i][k] = 1;
          break;
        }
        case 'D': {
          maze[i][k] = 2;
          break;
        }
        case 'L': {
          maze[i][k] = 3;
          break;
        }
        default: {
          maze[i][k] = 4;
        }
      }
    }
  }
  int ans = -1;
  int cnt = 0;
  for (int i = ((int)0); i <= ((int)n - 1); i++)
    for (int k = ((int)0); k <= ((int)m - 1); k++) {
      if (maze[i][k] == 4) continue;
      int anss = findscore(maze, state(i, k, maze[i][k]));
      if (anss > ans) {
        ans = 1;
        ans = anss;
      } else if (ans == anss)
        cnt++;
    }
  cout << ans << " " << cnt << endl;
  return 0;
}
