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 M = 5000 + 10;
vector<char> board[M];
string dir = "LRUD";
int per[4] = {1, 0, 3, 2};
map<char, int> rev;
struct NODE {
  char n_dir;
  pair<int, int> point[4];
};
vector<struct NODE> node[M];
int n, m;
void Ini() {
  for (int row = 0; row < n; row++) {
    int nrow = -1;
    int ncol = -1;
    for (int col = 0; col < m; col++) {
      if (board[row][col] != '.') {
        node[row][col].point[0] = make_pair(nrow, ncol);
        nrow = row;
        ncol = col;
      }
    }
    nrow = ncol = -1;
    for (int col = m - 1; col >= 0; col--) {
      if (board[row][col] != '.') {
        node[row][col].point[1] = make_pair(nrow, ncol);
        nrow = row;
        ncol = col;
      }
    }
  }
  for (int col = 0; col < m; col++) {
    int nrow = -1;
    int ncol = -1;
    for (int row = 0; row < n; row++) {
      if (board[row][col] != '.') {
        node[row][col].point[2] = make_pair(nrow, ncol);
        nrow = row;
        ncol = col;
      }
    }
    nrow = ncol = -1;
    for (int row = n - 1; row >= 0; row--) {
      if (board[row][col] != '.') {
        node[row][col].point[3] = make_pair(nrow, ncol);
        nrow = row;
        ncol = col;
      }
    }
  }
  return;
}
void DFS(int row, int col, int &res) {
  if (row == -1 && col == -1) {
    return;
  } else {
    for (int i = 0; i < 4; i++) {
      int nrow = node[row][col].point[i].first;
      int ncol = node[row][col].point[i].second;
      if (nrow != -1 && ncol != -1) {
        int irow = node[row][col].point[per[i]].first;
        int icol = node[row][col].point[per[i]].second;
        node[nrow][ncol].point[per[i]] = make_pair(irow, icol);
      }
    }
    int nextp = rev[node[row][col].n_dir];
    int nrow = node[row][col].point[nextp].first;
    int ncol = node[row][col].point[nextp].second;
    res++;
    DFS(nrow, ncol, res);
  }
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < 4; i++) {
    rev[dir[i]] = i;
  }
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    for (int j = 0; j < m; j++) {
      board[i].push_back(s[j]);
      NODE inode;
      inode.n_dir = '.';
      if (s[j] != '.') {
        inode.n_dir = s[j];
      }
      node[i].push_back(inode);
    }
  }
  Ini();
  int num_pos = 1;
  int max_ans = 0;
  for (int row = 0; row < n; row++) {
    for (int col = 0; col < m; col++) {
      if (board[row][col] != '.') {
        int res = 0;
        DFS(row, col, res);
        if (res > max_ans) {
          max_ans = res;
          num_pos = 1;
        } else {
          if (res == max_ans) {
            num_pos++;
          }
        }
        Ini();
      }
    }
  }
  cout << max_ans << " " << num_pos << endl;
  return 0;
}
