#include <bits/stdc++.h>
using namespace std;
const int maxn = 2 * 1e5 + 5;
const int inf = ~0UL >> 1;
char s[maxn];
int offset;
bool vowel[200];
struct IntervalStree {
  int n;
  int data[maxn + 10];
  int minv[4 * maxn + 10];
  void init(int n) {
    for (int i = 0; i < n; ++i) this->data[i] = 0;
    this->n = n;
    initTree(0, 0, n - 1);
  }
  void initTree(int root, int rl, int rr) {
    minv[root] = inf;
    if (rl == rr) return;
    int rm = (rl + rr) >> 1;
    initTree(root * 2 + 1, rl, rm);
    initTree(root * 2 + 2, rm + 1, rr);
  }
  long long query(int x) {
    x += offset;
    return internalQuery(0, 0, n - 1, 0, x);
  }
  long long internalQuery(int root, int rl, int rr, int l, int r) {
    if (l > r) return inf;
    if (rl == l && rr == r) {
      return minv[root];
    }
    int rm = (rl + rr) >> 1;
    int lv = internalQuery(root * 2 + 1, rl, rm, l, min(rm, r));
    int rv = internalQuery(root * 2 + 2, rm + 1, rr, max(rm + 1, l), r);
    return min(lv, rv);
  }
  void update(int k, int x) {
    k += offset;
    if (data[k] == 0) internalSetValue(0, 0, n - 1, k, x);
  }
  void internalSetValue(int root, int rl, int rr, int k, int x) {
    if (rl == rr) {
      minv[root] = data[rl] = x;
      return;
    }
    int rm = (rl + rr) >> 1;
    if (k <= rm) {
      internalSetValue(root * 2 + 1, rl, rm, k, x);
    } else {
      internalSetValue(root * 2 + 2, rm + 1, rr, k, x);
    }
    minv[root] = min(minv[root * 2 + 1], minv[root * 2 + 2]);
  }
} tree;
int MAIN() {
  vowel['a'] = vowel['e'] = vowel['i'] = vowel['o'] = vowel['u'] = true;
  vowel['A'] = vowel['E'] = vowel['I'] = vowel['O'] = vowel['U'] = true;
  scanf("%s", s + 1);
  int sz = strlen(s + 1);
  int c = 0;
  for (int i = 1; i <= sz; ++i) {
    if (vowel[s[i]]) ++c;
  }
  offset = c;
  if (c == 0) {
    printf("%d 1\n", sz);
    return 0;
  }
  tree.init(c);
  int mx, cnt, sm;
  mx = cnt = sm = 0;
  for (int i = 1; i <= sz; ++i) {
    if (vowel[s[i]])
      sm -= 1;
    else
      sm += 2;
    if (sm >= 0) {
      if (mx < i) {
        mx = i, cnt = 0;
      }
      if (mx == i) ++cnt;
    } else {
      int j = tree.query(sm);
      if (j != 0) {
        int len = i - tree.query(sm);
        if (mx < len) {
          mx = len, cnt = 0;
        }
        if (mx == len) ++cnt;
      }
      tree.update(sm, i);
    }
  }
  if (mx == 0)
    puts("No solution");
  else
    printf("%d %d\n", mx, cnt);
  return 0;
}
int main() {
  MAIN();
  return 0;
}
