Problem: Boboniu defines BN-string as a string s of characters 'B' and 'N'.

You can perform the following operations on the BN-string s:

  * Remove a character of s. 
  * Remove a substring "BN" or "NB" of s. 
  * Add a character 'B' or 'N' to the end of s. 
  * Add a string "BN" or "NB" to the end of s. 



Note that a string a is a substring of a string b if a can be obtained from b by deletion of several (possibly, zero or all) characters from the beginning and several (possibly, zero or all) characters from the end.

Boboniu thinks that BN-strings s and t are similar if and only if:

  * |s|=|t|. 
  * There exists a permutation p_1, p_2, …, p_{|s|} such that for all i (1≤ i≤ |s|), s_{p_i}=t_i. 



Boboniu also defines dist(s,t), the distance between s and t, as the minimum number of operations that makes s similar to t.

Now Boboniu gives you n non-empty BN-strings s_1,s_2,…, s_n and asks you to find a non-empty BN-string t such that the maximum distance to string s is minimized, i.e. you need to minimize max_{i=1}^n dist(s_i,t).

Input

The first line contains a single integer n (1≤ n≤ 3⋅ 10^5).

Each of the next n lines contains a string s_i (1≤ |s_i| ≤ 5⋅ 10^5). It is guaranteed that s_i only contains 'B' and 'N'. The sum of |s_i| does not exceed 5⋅ 10^5.

Output

In the first line, print the minimum max_{i=1}^n dist(s_i,t).

In the second line, print the suitable t.

If there are several possible t's, you can print any.

Examples

Input


3
B
N
BN


Output


1
BN


Input


10
N
BBBBBB
BNNNBBNBB
NNNNBNBNNBNNNBBN
NBNBN
NNNNNN
BNBNBNBBBBNNNNBBBBNNBBNBNBBNBBBBBBBB
NNNNBN
NBBBBBBBB
NNNNNN


Output


12
BBBBBBBBBBBBNNNNNNNNNNNN


Input


8
NNN
NNN
BBNNBBBN
NNNBNN
B
NNN
NNNNBNN
NNNNNNNNNNNNNNNBNNNNNNNBNB


Output


12
BBBBNNNNNNNNNNNN


Input


3
BNNNBNNNNBNBBNNNBBNNNNBBBBNNBBBBBBNBBBBBNBBBNNBBBNBNBBBN
BBBNBBBBNNNNNBBNBBBNNNBB
BBBBBBBBBBBBBBNBBBBBNBBBBBNBBBBNB


Output


12
BBBBBBBBBBBBBBBBBBBBBBBBBBNNNNNNNNNNNN

Note

In the first example dist(B,BN)=dist(N,BN)=1, dist(BN,BN)=0. So the maximum distance is 1.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
int INF = 1e9;
struct node {
  int mnx = INF, mxx = -INF, mny = INF, mxy = -INF, low = INF, top = -INF;
  node() {}
  node(pair<int, int> a)
      : mnx(a.first),
        mxx(a.first),
        mny(a.second),
        mxy(a.second),
        low(a.second - a.first),
        top(a.second - a.first) {}
  node(int mnx, int mxx, int mny, int mxy, int low, int top)
      : mnx(mnx), mxx(mxx), mny(mny), mxy(mxy), low(low), top(top) {}
};
node oper(node a, node b) {
  node ans;
  ans.mnx = min(a.mnx, b.mnx);
  ans.mny = min(a.mny, b.mny);
  ans.mxx = max(a.mxx, b.mxx);
  ans.mxy = max(a.mxy, b.mxy);
  ans.low = min(a.low, b.low);
  ans.top = max(a.top, b.top);
  return ans;
}
struct STree {
  vector<node> t;
  int n;
  STree() {}
  STree(int n) : n(n), t(2 * n + 5) {}
  void upd(int p, node v) {
    p += n;
    for (t[p] = v; p > 1; p >>= 1) t[p >> 1] = oper(t[p], t[p ^ 1]);
  }
  node query(int l, int r) {
    node res = node();
    for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
      if (l & 1) res = oper(res, t[l++]);
      if (r & 1) res = oper(res, t[--r]);
    }
    return res;
  }
};
STree st1, st2;
vector<pair<int, int> > v;
int n, top;
pair<int, int> lx = {1e9, -1e9}, ly = {1e9, -1e9};
pair<int, int> op(pair<int, int> a, int v) {
  return {min(a.first, v), max(a.second, v)};
}
void fix(int id, multiset<int> &v1, STree &st) {
  if (!int(v1.size()))
    st.upd(id, node());
  else {
    int mn = *v1.begin(), mx = *v1.rbegin();
    st.upd(id, node(mn, mx, id, id, id - mx, id - mn));
  }
}
const int MAXN = 3e5 + 10;
multiset<int> l1[MAXN], r1[MAXN];
int f(int x, int y) {
  node c1 = st1.query(0, y);
  node c2 = st1.query(y, top);
  node c3 = st2.query(y, top);
  node c4 = st2.query(0, y);
  int ans = 0;
  if (c1.mnx != INF) {
    int me = max(x - c1.mnx, y - c1.mny);
    ans = max(ans, me);
  }
  if (c3.mnx != INF) {
    int me = max(c3.mxx - x, c3.mxy - y);
    ans = max(ans, me);
  }
  if (c2.mnx != INF) {
    int me = c2.top - (y - x);
    ans = max(ans, me);
  }
  if (c4.mnx != INF) {
    int me = (y - x) - c4.low;
    ans = max(ans, me);
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 0, ThxDem = n; i < ThxDem; ++i) {
    string s;
    cin >> s;
    int x = 0, y = 0;
    for (auto c : s) x += c == 'B', y += c == 'N';
    v.push_back({x, y});
    lx = op(lx, x);
    ly = op(ly, y);
    r1[y].insert(x);
  }
  sort(v.begin(), v.end());
  top = ly.second + 1;
  st1 = STree(top);
  st2 = STree(top);
  for (int i = 0, ThxDem = top; i < ThxDem; ++i) fix(i, r1[i], st2);
  pair<int, pair<int, int> > ans = {1e9, {-1, -1}};
  int id = 0;
  for (int x = lx.first, ThxDem = lx.second + 1; x < ThxDem; ++x) {
    while (id < n && v[id].first <= x) {
      int x = v[id].first, y = v[id].second;
      r1[y].erase(r1[y].find(x));
      l1[y].insert(x);
      fix(y, l1[y], st1);
      fix(y, r1[y], st2);
      id++;
    }
    int l = ly.first - 1, r = ly.second + 1;
    if (l == -1 && x == 0) l = 0;
    while (r - l > 1) {
      int m = (l + r) / 2;
      if (f(x, m) > f(x, m + 1))
        l = m;
      else
        r = m;
    }
    int bst = l + 1;
    ans = min(ans, {f(x, bst), {x, bst}});
  }
  cout << ans.first << "\n";
  cout << string(ans.second.first, 'B') + string(ans.second.second, 'N')
       << "\n";
}