#include <bits/stdc++.h>
using namespace std;
const int MaxN = 200005;
const int MaxS = MaxN * 4;
char s[MaxN];
int last[52];
int getId(char c) {
  if (islower(c))
    return c - 'a';
  else
    return c - 'A' + 26;
}
int isvowel(char c) {
  c = tolower(c);
  return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') ? 1 : -2;
}
struct Node {
  int l, r;
  int mn, del;
} seg[MaxS];
void ins(int k, int v) {
  seg[k].del += v;
  seg[k].mn += v;
}
void init(int k, int l, int r) {
  seg[k].l = l;
  seg[k].r = r;
  seg[k].mn = seg[k].del = 0;
  if (l == r) return;
  int mid = (l + r) >> 1;
  init(k << 1, l, mid);
  init(k << 1 | 1, mid + 1, r);
}
void pushdown(int k) {
  if (seg[k].del) {
    ins(k << 1, seg[k].del);
    ins(k << 1 | 1, seg[k].del);
    seg[k].del = 0;
  }
}
void update(int k) { seg[k].mn = min(seg[k << 1].mn, seg[k << 1 | 1].mn); }
void add(int k, int l, int r, int v) {
  if (seg[k].l > r || seg[k].r < l) return;
  if (seg[k].l >= l && seg[k].r <= r) {
    ins(k, v);
    return;
  }
  pushdown(k);
  add(k << 1, l, r, v);
  add(k << 1 | 1, l, r, v);
  update(k);
}
int read(int k, int n, int v = 0) {
  if (seg[k].l == seg[k].r) {
    if (seg[k].mn <= v)
      return seg[k].l;
    else
      return -1;
  }
  pushdown(k);
  int mid = (seg[k].l + seg[k].r) >> 1;
  if (n > mid) {
    if (seg[k << 1].mn <= v)
      return read(k << 1, n, v);
    else
      return read(k << 1 | 1, n, v);
  } else
    return read(k << 1, n, v);
}
void doit() {
  int n = strlen(s + 1);
  int ret = 0, cnt = 0, idx;
  init(1, 1, n);
  memset(last, 0, sizeof(last));
  for (int i = 1; i <= n; i++) {
    add(1, last[getId(s[i])] + 1, i, isvowel(s[i]));
    idx = read(1, i);
    if (idx != -1) {
      if (ret < i - idx + 1) {
        ret = i - idx + 1;
        cnt = 1;
      } else if (ret == i - idx + 1)
        cnt++;
    }
  }
  if (ret == 0)
    puts("No solution");
  else
    printf("%d %d\n", ret, cnt);
}
int main() {
  while (scanf("%s", s + 1) == 1) {
    doit();
  }
  return 0;
}
