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 MX = 5005;
int n, m;
char arr[MX][MX];
set<int> r[MX], c[MX], nr[MX], nc[MX];
void prec(int x, int y) {
  for (int i = 0; i < n; i++) c[i].clear(), nc[i].clear();
  for (int i = 0; i < m; i++) r[i].clear(), nr[i].clear();
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (i == x && j == y) continue;
      if (arr[i][j] != '.') {
        r[i].insert(j);
        nr[i].insert(-j);
        c[j].insert(i);
        nc[j].insert(-i);
      }
    }
  }
}
int dfs(int x, int y) {
  int ans = 0;
  if (arr[x][y] == 'D') {
    auto it = c[y].upper_bound(x);
    if (it == c[y].end())
      ans = 1;
    else {
      int ind = *it;
      c[y].erase(ind);
      nc[y].erase(-ind);
      r[ind].erase(y);
      nr[ind].erase(-y);
      ans = 1 + dfs(ind, y);
    }
  } else if (arr[x][y] == 'R') {
    auto it = r[x].upper_bound(y);
    if (it == r[x].end())
      ans = 1;
    else {
      int ind = *it;
      r[x].erase(ind);
      c[ind].erase(x);
      nc[ind].erase(-x);
      nr[x].erase(-ind);
      ans = 1 + dfs(x, ind);
    }
  } else if (arr[x][y] == 'U') {
    auto it = nc[y].upper_bound(-x);
    if (it == nc[y].end())
      ans = 1;
    else {
      int ind = -1 * (*it);
      c[y].erase(ind);
      r[ind].erase(y);
      nr[ind].erase(-y);
      nc[y].erase(-ind);
      ans = 1 + dfs(ind, y);
    }
  } else if (arr[x][y] == 'L') {
    auto it = nr[x].upper_bound(-y);
    if (it == nr[x].end())
      ans = 1;
    else {
      int ind = -1 * (*it);
      r[x].erase(ind);
      c[ind].erase(x);
      nc[ind].erase(-x);
      nr[x].erase(-ind);
      ans = 1 + dfs(x, ind);
    }
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> arr[i][j];
    }
  }
  int mx = 0, times = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      prec(i, j);
      int cnt = dfs(i, j);
      if (cnt == mx) times++;
      if (cnt > mx) {
        mx = cnt;
        times = 1;
      }
    }
  }
  cout << mx << " " << times << endl;
  return 0;
}
