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>
int n, m;
char buf[5001];
char input[5001];
int left[5001];
int right[5001];
int up[5001];
int down[5001];
int getIndex(int r, int c) { return r * m + c; }
void setLinklist() {
  memset(left, -1, sizeof(left));
  memset(right, -1, sizeof(right));
  memset(up, -1, sizeof(up));
  memset(down, -1, sizeof(down));
  for (int r = 0; r < n; ++r) {
    int prevIdx = -1;
    for (int c = 0; c < m; ++c) {
      int currIdx = getIndex(r, c);
      if (buf[currIdx] != '.') {
        if (prevIdx != -1) {
          right[prevIdx] = currIdx;
          left[currIdx] = prevIdx;
        }
        prevIdx = currIdx;
      }
    }
  }
  for (int c = 0; c < m; ++c) {
    int prevIdx = -1;
    for (int r = 0; r < n; ++r) {
      int currIdx = getIndex(r, c);
      if (buf[currIdx] != '.') {
        if (prevIdx != -1) {
          down[prevIdx] = currIdx;
          up[currIdx] = prevIdx;
        }
        prevIdx = currIdx;
      }
    }
  }
}
void remove(int idx) {
  if (left[idx] != -1) {
    right[left[idx]] = right[idx];
  }
  if (right[idx] != -1) {
    left[right[idx]] = left[idx];
  }
  if (up[idx] != -1) {
    down[up[idx]] = down[idx];
  }
  if (down[idx] != -1) {
    up[down[idx]] = up[idx];
  }
}
void add(int idx) {
  if (left[idx] != -1) {
    right[left[idx]] = idx;
  }
  if (right[idx] != -1) {
    left[right[idx]] = idx;
  }
  if (up[idx] != -1) {
    down[up[idx]] = idx;
  }
  if (down[idx] != -1) {
    up[down[idx]] = idx;
  }
}
int dfs(int idx) {
  if (idx == -1) {
    return 0;
  }
  int res = 1;
  remove(idx);
  if (buf[idx] == 'L') {
    res += dfs(left[idx]);
  } else if (buf[idx] == 'R') {
    res += dfs(right[idx]);
  } else if (buf[idx] == 'U') {
    res += dfs(up[idx]);
  } else if (buf[idx] == 'D') {
    res += dfs(down[idx]);
  }
  add(idx);
  return res;
}
int main() {
  while (scanf("%d%d", &n, &m) != EOF) {
    for (int i = 0; i < n; ++i) {
      scanf("%s", input);
      for (int j = 0; j < m; ++j) {
        buf[getIndex(i, j)] = input[j];
      }
    }
    setLinklist();
    int res = 0;
    int cnt = 0;
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < m; ++j) {
        int idx = getIndex(i, j);
        if (buf[idx] == '.') {
          continue;
        }
        int tmp = dfs(idx);
        if (tmp > res) {
          res = tmp;
          cnt = 1;
        } else if (tmp == res) {
          cnt++;
        }
      }
    }
    printf("%d %d\n", res, cnt);
  }
  return 0;
}
