Problem: Haiku is a genre of Japanese traditional poetry.

A haiku poem consists of 17 syllables split into three phrases, containing 5, 7 and 5 syllables correspondingly (the first phrase should contain exactly 5 syllables, the second phrase should contain exactly 7 syllables, and the third phrase should contain exactly 5 syllables). A haiku masterpiece contains a description of a moment in those three phrases. Every word is important in a small poem, which is why haiku are rich with symbols. Each word has a special meaning, a special role. The main principle of haiku is to say much using a few words.

To simplify the matter, in the given problem we will consider that the number of syllable in the phrase is equal to the number of vowel letters there. Only the following letters are regarded as vowel letters: "a", "e", "i", "o" and "u".

Three phases from a certain poem are given. Determine whether it is haiku or not.

Input

The input data consists of three lines. The length of each line is between 1 and 100, inclusive. The i-th line contains the i-th phrase of the poem. Each phrase consists of one or more words, which are separated by one or more spaces. A word is a non-empty sequence of lowercase Latin letters. Leading and/or trailing spaces in phrases are allowed. Every phrase has at least one non-space character. See the example for clarification.

Output

Print "YES" (without the quotes) if the poem is a haiku. Otherwise, print "NO" (also without the quotes).

Examples

Input

on  codeforces 
beta round is running
   a rustling of keys 


Output

YES

Input

how many gallons
of edo s rain did you drink
                                cuckoo


Output

NO

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:256000000")
using namespace std;
const int INF = 1000001000;
const long long INFLL = INF * 1LL * INF;
const int mod = 1000 * 1000 * 1000 + 7;
const int mod9 = 1000 * 1000 * 1000 + 9;
const int modr = 99990001;
const long double PI = 3.1415926535897932385;
template <class T>
void zero(T val, T& first) {
  first = val;
}
template <class T, class... Targs>
void zero(T val, T& first, Targs&... Fargs) {
  first = val;
  zero(val, Fargs...);
}
template <class T, class T2>
std::istream& operator>>(std::istream& is, pair<T, T2>& p) {
  return is >> p.first >> p.second;
}
template <class T>
std::istream& readN(T& first, int n, int st = 0) {
  for (int i = st, iend = (st + n - 1); i <= iend; i++) cin >> first[i];
  return cin;
}
template <class T>
std::istream& readS(set<T>& first, int n) {
  T second = *first.rbegin();
  for (int i = 0, iend = (n - 1); i <= iend; i++) {
    cin >> second;
    first.insert(second);
  }
  return cin;
}
template <class T>
std::istream& read(T& first) {
  return cin >> first;
}
template <class T, class... Targs>
std::istream& read(T& first, Targs&... Fargs) {
  return read(first), read(Fargs...);
}
template <class T, class T2>
std::ostream& operator<<(std::ostream& os, pair<T, T2> p) {
  return os << p.first << " " << p.second;
}
template <class T>
std::ostream& operator<<(std::ostream& os, vector<T> v) {
  bool f = true;
  for (auto second : v) {
    if (!f) os << ' ';
    os << second;
    f = false;
  }
  return os;
}
template <class T>
std::ostream& operator<<(std::ostream& os, set<T> v) {
  bool f = true;
  for (auto second : v) {
    if (!f) os << ' ';
    os << second;
    f = false;
  }
  return os;
}
template <class T>
std::ostream& operator<<(std::ostream& os, multiset<T> v) {
  bool f = true;
  for (auto second : v) {
    if (!f) os << ' ';
    os << second;
    f = false;
  }
  return os;
}
template <class T, class T2>
std::ostream& operator<<(std::ostream& os, map<T, T2> v) {
  bool f = true;
  for (pair<T, T2> second : v) {
    if (!f) os << ' ';
    os << second.first << "=>" << second.second;
    f = false;
  }
  return os;
}
template <class T>
std::ostream& outV(T first, char del = ' ') {
  bool f = true;
  for (auto second : first) {
    if (!f) cout << del;
    cout << second;
    f = false;
  }
  return cout;
}
template <class T>
std::ostream& outN(T first, int n = -1, int st = 0) {
  for (int i = st, iend = (n == -1 ? (int)first.size() - 1 : st + n - 1);
       i <= iend; i++) {
    cout << first[i];
    if (i < iend) cout << ' ';
  }
  return cout;
}
template <class T>
std::ostream& outAN(T first, int n = -1, int st = 0) {
  for (int i = st, iend = (n - 1); i <= iend; i++) {
    cout << first[i];
    if (i < iend) cout << ' ';
  }
  return cout;
}
template <class T>
std::ostream& outA2(T first, int n, int m) {
  for (int i = 0, iend = (n - 1); i <= iend; i++) {
    for (int j = 0, jend = (m - 1); j <= jend; j++)
      cout << first[i][j] << (j == m - 1 ? '\n' : ' ');
  }
  return cout;
}
template <class T>
std::ostream& out(T first) {
  return cout << first;
}
template <class T, class... Targs>
std::ostream& out(T first, Targs... Fargs) {
  return out(first) << " ", out(Fargs...);
}
template <typename T>
void srt(T& a, int st, int fn, bool isArr) {
  sort(a + st, a + fn + 1);
}
template <class T>
void srt(T& a, int st = 0, int fn = 0) {
  sort(a.begin() + st, fn ? a.begin() + fn + 1 : a.end());
}
template <typename T>
T rev_num(T a) {
  T r = 0;
  for (; a; a /= 10) r = r * 10 + a % 10;
  return r;
}
template <typename T>
void rev(T& a, int st, int fn, bool isArr) {
  reverse(a + st, a + fn + 1);
}
template <class T>
void rev(T& a, int st = 0, int fn = 0) {
  reverse(a.begin() + st, fn ? a.begin() + fn + 1 : a.end());
}
long long sqr(long long a) { return a * a; };
long long sqr(int a) { return a * 1LL * a; };
long double sqr(long double a) { return a * a; };
long long sqDist(pair<long long, long long> first,
                 pair<long long, long long> second) {
  return sqr(first.first - second.first) + sqr(first.second - second.second);
}
long double dist(pair<long long, long long> first,
                 pair<long long, long long> second) {
  return sqrt(sqDist(first, second));
}
long long phi(int n) {
  int res = n;
  for (long long i = 2; i * i <= n; i++)
    if (n % i == 0) {
      while (n % i == 0) n /= i;
      res -= res / i;
    }
  if (n > 1) res -= res / n;
  return res;
}
long long bpm(long long a, long long n = -2, long long m = mod) {
  n = n < 0 ? n + m : n;
  long long r = 1;
  while (n) {
    if (n & 1) r = (r * a) % m;
    a = (a * a) % m;
    n >>= 1;
  }
  return r;
}
unsigned long long gcd(unsigned long long a, unsigned long long b) {
  while (b) {
    a %= b;
    swap(a, b);
  }
  return a;
}
long long gcd_cb(long long a, long long b, long long& first,
                 long long& second) {
  if (!b) {
    first = 1;
    second = 0;
    return a;
  }
  long long x1, y1, g;
  g = gcd_cb(b, a % b, x1, y1);
  first = y1;
  second = x1 - a / b * y1;
  return g;
}
vector<long long> fact;
void fact_prec(int n = 20) {
  fact.resize(n + 1);
  fact[0] = 1;
  for (int i = 1, iend = (n); i <= iend; i++) {
    fact[i] = fact[i - 1] * i;
  }
}
vector<long double> factd;
void fact_precd(int n = 146) {
  factd.resize(n + 1);
  factd[0] = 1;
  for (int i = 1, iend = (n); i <= iend; i++) {
    factd[i] = factd[i - 1] * i;
  }
}
string str(long long a) {
  string r = "";
  for (; a; a /= 10) r += a % 10 + '0';
  rev(r);
  return r;
}
template <class T>
int bitc(T first) {
  int r = 0;
  for (T d = first; d > 0; d >>= 1) {
    r += d & 1;
  }
  return r;
}
const int N = 300005;
int gc(string s) {
  return count(s.begin(), s.end(), 'a') + count(s.begin(), s.end(), 'e') +
         count(s.begin(), s.end(), 'i') + count(s.begin(), s.end(), 'o') +
         count(s.begin(), s.end(), 'u');
}
int main() {
  string f, s, t;
  getline(cin, f);
  getline(cin, s);
  getline(cin, t);
  puts((gc(f) == 5 && gc(s) == 7 && gc(t) == 5) ? "YES" : "NO");
  ;
  return 0;
}