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;
int const DX[] = {0, -1, 0, 1};
int const DY[] = {-1, 0, 1, 0};
string const DIRS = "ULDR";
int main() {
  cin.sync_with_stdio(false);
  cout.sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  vector<string> table(n);
  for (int i = (0); i < ((n)); ++i) cin >> table[i];
  vector<vector<pair<int, int> > > levels[4];
  for (int dir = (0); dir < ((4)); ++dir)
    levels[dir].resize(n, vector<pair<int, int> >(m, make_pair(-1, -1)));
  for (int j = (0); j < ((m)); ++j) {
    for (int i = (0); i < ((n - 1)); ++i) {
      if (table[i][j] == '.')
        levels[0][i + 1][j] = levels[0][i][j];
      else
        levels[0][i + 1][j] = make_pair(i, j);
    }
    for (int i = n - 1; i > 0; --i) {
      if (table[i][j] == '.')
        levels[2][i - 1][j] = levels[2][i][j];
      else
        levels[2][i - 1][j] = make_pair(i, j);
    }
  }
  for (int i = (0); i < ((n)); ++i) {
    for (int j = (0); j < ((m - 1)); ++j) {
      if (table[i][j] == '.')
        levels[1][i][j + 1] = levels[1][i][j];
      else
        levels[1][i][j + 1] = make_pair(i, j);
    }
    for (int j = m - 1; j > 0; --j) {
      if (table[i][j] == '.')
        levels[3][i][j - 1] = levels[3][i][j];
      else
        levels[3][i][j - 1] = make_pair(i, j);
    }
  }
  vector<vector<pair<int, int> > > tempLevels[4];
  int best = 0;
  int count = 0;
  for (int i = (0); i < ((n)); ++i)
    for (int j = (0); j < ((m)); ++j)
      if (table[i][j] != '.') {
        for (int i = (0); i < ((4)); ++i) tempLevels[i] = levels[i];
        int current = 0;
        pair<int, int> pos = make_pair(i, j);
        while (pos != make_pair(-1, -1)) {
          int currentDir = DIRS.find(table[pos.first][pos.second]);
          const pair<int, int>& left = levels[1][pos.first][pos.second];
          const pair<int, int>& right = levels[3][pos.first][pos.second];
          const pair<int, int>& up = levels[0][pos.first][pos.second];
          const pair<int, int>& down = levels[2][pos.first][pos.second];
          if (left.first > -1) levels[3][left.first][left.second] = right;
          if (right.first > -1) levels[1][right.first][right.second] = left;
          if (up.first > -1) levels[2][up.first][up.second] = down;
          if (down.first > -1) levels[0][down.first][down.second] = up;
          pos = levels[currentDir][pos.first][pos.second];
          ++current;
        }
        if (best < current) {
          best = current;
          count = 1;
        } else if (best == current) {
          ++count;
        }
        for (int i = (0); i < ((4)); ++i) levels[i] = tempLevels[i];
      }
  cout << best << " " << count << endl;
  return 0;
}
