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 MAX_SIZE = 5005;
char grid[MAX_SIZE][MAX_SIZE];
int n, m;
bool taken[MAX_SIZE][MAX_SIZE];
pair<int, int> findNext(int sy, int sx) {
  pair<int, int> ret = make_pair(-1, -1);
  int x;
  int y;
  if (grid[sy][sx] == 'U') {
    x = sx;
    y = sy - 1;
    while (y >= 0 && y < n && x >= 0 && x < m) {
      if (!taken[y][x] && grid[y][x] != '.') {
        ret.first = y;
        ret.second = x;
        return ret;
      }
      --y;
    }
    return ret;
  }
  if (grid[sy][sx] == 'D') {
    x = sx;
    y = sy + 1;
    while (y >= 0 && y < n && x >= 0 && x < m) {
      if (!taken[y][x] && grid[y][x] != '.') {
        ret.first = y;
        ret.second = x;
        return ret;
      }
      ++y;
    }
    return ret;
  }
  if (grid[sy][sx] == 'L') {
    x = sx - 1;
    y = sy;
    while (y >= 0 && y < n && x >= 0 && x < m) {
      if (!taken[y][x] && grid[y][x] != '.') {
        ret.first = y;
        ret.second = x;
        return ret;
      }
      --x;
    }
    return ret;
  }
  if (grid[sy][sx] == 'R') {
    x = sx + 1;
    y = sy;
    while (y >= 0 && y < n && x >= 0 && x < m) {
      if (!taken[y][x] && grid[y][x] != '.') {
        ret.first = y;
        ret.second = x;
        return ret;
      }
      ++x;
    }
    return ret;
  }
}
vector<pair<int, int> > findStarts() {
  vector<pair<int, int> > starts;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      bool flag = false;
      if (grid[i][j] != '.') {
        for (int k = j + 1; k < m && !flag; ++k) {
          if (grid[i][k] == 'L') flag = true;
          break;
        }
        for (int k = j - 1; k >= 0 && !flag; --k) {
          if (grid[i][k] == 'R') flag = true;
          break;
        }
        for (int k = i + 1; k < n && !flag; ++k) {
          if (grid[k][j] == 'U') flag = true;
          break;
        }
        for (int k = i - 1; k >= 0 && !flag; --k) {
          if (grid[k][j] == 'D') flag = true;
          break;
        }
        if (!flag) {
          starts.push_back(make_pair(i, j));
        }
      }
    }
  }
  return starts;
}
int visit(int y, int x) {
  int ret = 0;
  while (y != -1 && x != -1) {
    ++ret;
    taken[y][x] = true;
    pair<int, int> p = findNext(y, x);
    y = p.first;
    x = p.second;
  }
  return ret;
}
int main() {
  scanf("%d%d\n", &n, &m);
  char c;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      scanf("%c", &c);
      grid[i][j] = c;
    }
    scanf("%c", &c);
  }
  vector<pair<int, int> > starts = findStarts();
  map<int, int> count;
  int mx = -1;
  for (int i = 0; i < starts.size(); ++i) {
    memset(taken, 0, sizeof(taken));
    int y = starts[i].first;
    int x = starts[i].second;
    int ret = visit(y, x);
    if (count.find(ret) != count.end()) {
      count[ret]++;
    } else {
      count[ret] = 1;
    }
    if (ret > mx) {
      mx = ret;
    }
  }
  printf("%d %d\n", mx, count[mx]);
  return 0;
}
