#include <bits/stdc++.h>
using namespace std;
char str[211111];
int num[211111], dp[211111], ans[211111];
char f[] = "aeiouAEIOU";
struct st {
  int l, r, minr;
} tree[211111 << 2];
int check(char c) {
  int i;
  for (i = 0; i <= 9; i++)
    if (c == f[i]) return 0;
  return 1;
}
void build(int l, int r, int index) {
  tree[index].l = l, tree[index].r = r;
  if (l == r) {
    tree[index].minr = 1000000000;
    return;
  }
  int mid = l + r >> 1;
  build(l, mid, index << 1);
  build(mid + 1, r, index << 1 | 1);
  tree[index].minr = min(tree[index << 1].minr, tree[index << 1 | 1].minr);
}
void update(int a, int index, int v) {
  if (tree[index].l == tree[index].r) {
    tree[index].minr = v;
    return;
  }
  int mid = tree[index].l + tree[index].r >> 1;
  if (mid >= a)
    update(a, index << 1, v);
  else
    update(a, index << 1 | 1, v);
  tree[index].minr = min(tree[index << 1].minr, tree[index << 1 | 1].minr);
}
int query(int v, int index, int x) {
  if (tree[index].l == tree[index].r) {
    return x - tree[index].l;
  }
  if (tree[index << 1].minr <= v)
    return query(v, index << 1, x);
  else if (tree[index << 1 | 1].minr <= v)
    return query(v, index << 1 | 1, x);
  else
    return 0;
}
int main() {
  scanf("%s", str);
  int len = strlen(str), i, j;
  for (i = 0; i < len; i++) {
    if (check(str[i]))
      num[i] = 2;
    else
      num[i] = -1;
  }
  dp[0] = num[0];
  for (i = 1; i < len; i++) {
    dp[i] = dp[i - 1] + num[i];
  }
  build(0, len, 1);
  for (i = 0; i < len; i++) {
    update(i, 1, dp[i]);
    if (dp[i] >= 0) {
      ans[i] = i + 1;
      continue;
    }
    ans[i] = query(dp[i], 1, i);
  }
  int maxnum = 0;
  for (i = 0; i < len; i++) {
    maxnum = max(maxnum, ans[i]);
  }
  if (maxnum == 0) {
    printf("No solution\n");
  } else {
    int cou = 0;
    for (i = 0; i < len; i++) {
      if (ans[i] == maxnum) cou++;
    }
    printf("%d %d\n", maxnum, cou);
  }
  return 0;
}
