#include <bits/stdc++.h>
using namespace std;
long long ipow(long long base, long long exp) {
  long long result = 1;
  for (;;) {
    if (exp & 1) result = (result * base) % 1000000007;
    exp >>= 1;
    if (!exp) break;
    base = (base * base) % 1000000007;
  }
  return result;
}
bool sortinrev(const pair<int, int> &a, const pair<int, int> &b) {
  return (a.first > b.first);
}
long long fact(long long n) {
  if (n >= 1000000007) return 0;
  long long result = 1;
  for (int i = 1; i <= n; i++) result = (result * i) % 1000000007;
  return result;
}
bool is_prime(long long n) {
  if (n == 1) {
    return false;
  }
  long long i = 2;
  while (i * i <= n) {
    if (n % i == 0) {
      return false;
    }
    i += 1;
  }
  return true;
}
bool areRotations(string str1, string str2) {
  if (str1.length() != str2.length()) return false;
  string temp = str1 + str1;
  return (temp.find(str2) != string::npos);
}
bool pow2(long long x) { return x && (!(x & (x - 1))); }
long long maxXorSum(long long n, long long k) {
  if (k == 1) return n;
  long long res = 1;
  while (res <= n) res <<= 1;
  return res - 1;
}
long long mcost(long long a[], long long n) {
  long long y;
  if (n % 2 == 1)
    y = a[n / 2];
  else
    y = (a[n / 2] + a[(n - 2) / 2]) / 2;
  long long s = 0;
  for (long long i = 0; i < n; i++) s += abs(a[i] - y);
  return s;
}
long long largest_subarray(long long a[], long long n) {
  unordered_map<long long, long long> index;
  long long ans = 0;
  for (long long i = 0, j = 0; i < n; i++) {
    j = max(index[a[i]], j);
    ans = max(ans, i - j + 1);
    index[a[i]] = i + 1;
  }
  return ans;
}
long long b[101], sz;
pair<long long, long long> adj[101];
void dfs(int s) {
  b[s] = 1;
  for (int i = 1; i <= sz; i++) {
    if (!b[i] &&
        (adj[s].first == adj[i].first || adj[s].second == adj[i].second))
      dfs(i);
  }
}
void display(int a[], int n) {
  for (int i = 0; i < n; i++) {
    cout << a[i] << "  ";
  }
  cout << endl;
}
void per(int a[], int n) {
  long long d = 0;
  sort(a, a + n);
  do {
    long long s = 0, x = 1;
    for (long long i = 0; i < n; i++) {
      s += a[i];
      if (s == 0) {
        x = -1;
      }
    }
    if (x == 1) {
      cout << "YES" << endl;
      d = 1;
      for (long long i = 0; i < n; i++) {
        cout << a[i] << " ";
      }
      cout << endl;
      break;
    }
  } while (next_permutation(a, a + n));
  if (d == 0) {
    cout << "NO" << endl;
  }
}
int gcd(int a, int b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
bool leftRotate(int a[], int d, int n) {
  d = d % n;
  int g_c_d = gcd(d, n);
  for (int i = 0; i < g_c_d; i++) {
    int temp = a[i];
    int j = i;
    while (1) {
      int k = j + d;
      if (k >= n) k = k - n;
      if (k == i) break;
      a[j] = a[k];
      j = k;
    }
    a[j] = temp;
  }
  long long s = 0, x = 1;
  for (long long i = 0; i < n; i++) {
    s += a[i];
    if (s == 0) {
      x = 0;
    }
  }
  if (x == 1) {
    cout << "YES" << endl;
    for (long long i = 0; i < n; i++) {
      cout << a[i] << " ";
    }
    cout << endl;
    return true;
  }
  return false;
}
long long rec(long long n, long long k) {
  if (n == 1) {
    return 1;
  }
  if (k == 1) {
    return n;
  }
  return ((n + rec(n - 1, k - 1)) % 1000000007);
}
bool isPerfectSquare(long long x) {
  if (sqrt(x) * sqrt(x) == x) {
    return true;
  }
  return false;
}
bool isSubSequence(string str1, string str2, int m, int n) {
  int j = 0, x = 0, d = 0;
  if (str1[0] == str2[0]) {
    for (int i = 0; i < n && j < m; i++) {
      if (str1[j] == str2[i]) {
        j++;
      } else {
        d = i;
        break;
      }
    }
    if (j == m) {
      return true;
    }
    long long p = 9, v = 0;
    for (int i = n - 1; i >= d; i--) {
      if (v == 10 - j) {
        break;
      }
      if (str1[p] == str2[i]) {
        p--;
        v++;
      } else {
        break;
      }
    }
    if (v + j == 10) {
      return true;
    } else {
      return false;
    }
  } else {
    size_t found = str2.find(str1);
    if (found != string::npos && str1[9] == str2[n - 1]) {
      return true;
    } else {
      return false;
    }
  }
}
long long countBits(long long n) {
  long long count = 0;
  while (n) {
    count++;
    n >>= 1;
  }
  return count;
}
void kFactors(int n, int k) {
  vector<int> P;
  while (n % 2 == 0) {
    P.push_back(2);
    n /= 2;
  }
  for (int i = 3; i * i <= n; i = i + 2) {
    while (n % i == 0) {
      n = n / i;
      P.push_back(i);
    }
  }
  if (n > 2) P.push_back(n);
  if (P.size() < k) {
    cout << "-1" << endl;
    return;
  }
  for (int i = 0; i < k - 1; i++) cout << P[i] << " ";
  int product = 1;
  for (int i = k - 1; i < P.size(); i++) product = product * P[i];
  cout << product << endl;
}
long long fin(long long n) {
  long long x = 0, y = 0, z = 0;
  for (long long i = 2; i <= n; i++) {
    if (n % i == 0 && x == 0) {
      x = i;
      n /= i;
    } else if (n % i == 0 && y == 0) {
      y = i;
      n /= i;
      if (n != y && n != 1 && x != y && x != n) {
        z = n;
        cout << "YES" << endl;
        cout << x << " " << y << " " << z << endl;
        return 0;
      } else {
        break;
      }
    }
  }
  cout << "NO" << endl;
  return 0;
}
bool sov(long long a[500][500], long long n, long long m) {
  map<long long, vector<long long>> make_pair;
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      make_pair[j - i].push_back(a[i][j]);
    }
  }
  for (auto i : make_pair) {
    for (long long j = 1; j < i.second.size(); j++) {
      if (i.second[j] != i.second[0]) return false;
    }
  }
  return true;
}
int main() {
  int t;
  t = 1;
  while (t--) {
    long long n, k;
    cin >> n >> k;
    if (k > n || (k == 1 && n != 1)) {
      cout << -1;
    } else {
      vector<char> s;
      char p = 'a';
      for (long long i = 0; i < n - k + 2; i++) {
        if (i % 2 == 0) {
          s.push_back(p);
        } else {
          s.push_back('b');
        }
      }
      p = 'c';
      for (long long i = n - k + 2; i < n; i++) {
        s.push_back(p);
        p++;
      }
      for (long long i = 0; i < n; i++) {
        cout << s[i];
      }
    }
  }
  return 0;
}

### Prompt

Please create a solution in Cpp to the following problem:

Little penguin Polo adores strings. But most of all he adores strings of length n.

One day he wanted to find a string that meets the following conditions:

  1. The string consists of n lowercase English letters (that is, the string's length equals n), exactly k of these letters are distinct. 
  2. No two neighbouring letters of a string coincide; that is, if we represent a string as s = s1s2... sn, then the following inequality holds, si ≠ si + 1(1 ≤ i < n). 
  3. Among all strings that meet points 1 and 2, the required string is lexicographically smallest. 



Help him find such string or state that such string doesn't exist.

String x = x1x2... xp is lexicographically less than string y = y1y2... yq, if either p < q and x1 = y1, x2 = y2, ... , xp = yp, or there is such number r (r < p, r < q), that x1 = y1, x2 = y2, ... , xr = yr and xr + 1 < yr + 1. The characters of the strings are compared by their ASCII codes.

Input

A single line contains two positive integers n and k (1 ≤ n ≤ 106, 1 ≤ k ≤ 26) — the string's length and the number of distinct letters.

Output

In a single line print the required string. If there isn't such string, print "-1" (without the quotes).

Examples

Input

7 4


Output

ababacd


Input

4 7


Output

-1

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
long long ipow(long long base, long long exp) {
  long long result = 1;
  for (;;) {
    if (exp & 1) result = (result * base) % 1000000007;
    exp >>= 1;
    if (!exp) break;
    base = (base * base) % 1000000007;
  }
  return result;
}
bool sortinrev(const pair<int, int> &a, const pair<int, int> &b) {
  return (a.first > b.first);
}
long long fact(long long n) {
  if (n >= 1000000007) return 0;
  long long result = 1;
  for (int i = 1; i <= n; i++) result = (result * i) % 1000000007;
  return result;
}
bool is_prime(long long n) {
  if (n == 1) {
    return false;
  }
  long long i = 2;
  while (i * i <= n) {
    if (n % i == 0) {
      return false;
    }
    i += 1;
  }
  return true;
}
bool areRotations(string str1, string str2) {
  if (str1.length() != str2.length()) return false;
  string temp = str1 + str1;
  return (temp.find(str2) != string::npos);
}
bool pow2(long long x) { return x && (!(x & (x - 1))); }
long long maxXorSum(long long n, long long k) {
  if (k == 1) return n;
  long long res = 1;
  while (res <= n) res <<= 1;
  return res - 1;
}
long long mcost(long long a[], long long n) {
  long long y;
  if (n % 2 == 1)
    y = a[n / 2];
  else
    y = (a[n / 2] + a[(n - 2) / 2]) / 2;
  long long s = 0;
  for (long long i = 0; i < n; i++) s += abs(a[i] - y);
  return s;
}
long long largest_subarray(long long a[], long long n) {
  unordered_map<long long, long long> index;
  long long ans = 0;
  for (long long i = 0, j = 0; i < n; i++) {
    j = max(index[a[i]], j);
    ans = max(ans, i - j + 1);
    index[a[i]] = i + 1;
  }
  return ans;
}
long long b[101], sz;
pair<long long, long long> adj[101];
void dfs(int s) {
  b[s] = 1;
  for (int i = 1; i <= sz; i++) {
    if (!b[i] &&
        (adj[s].first == adj[i].first || adj[s].second == adj[i].second))
      dfs(i);
  }
}
void display(int a[], int n) {
  for (int i = 0; i < n; i++) {
    cout << a[i] << "  ";
  }
  cout << endl;
}
void per(int a[], int n) {
  long long d = 0;
  sort(a, a + n);
  do {
    long long s = 0, x = 1;
    for (long long i = 0; i < n; i++) {
      s += a[i];
      if (s == 0) {
        x = -1;
      }
    }
    if (x == 1) {
      cout << "YES" << endl;
      d = 1;
      for (long long i = 0; i < n; i++) {
        cout << a[i] << " ";
      }
      cout << endl;
      break;
    }
  } while (next_permutation(a, a + n));
  if (d == 0) {
    cout << "NO" << endl;
  }
}
int gcd(int a, int b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
bool leftRotate(int a[], int d, int n) {
  d = d % n;
  int g_c_d = gcd(d, n);
  for (int i = 0; i < g_c_d; i++) {
    int temp = a[i];
    int j = i;
    while (1) {
      int k = j + d;
      if (k >= n) k = k - n;
      if (k == i) break;
      a[j] = a[k];
      j = k;
    }
    a[j] = temp;
  }
  long long s = 0, x = 1;
  for (long long i = 0; i < n; i++) {
    s += a[i];
    if (s == 0) {
      x = 0;
    }
  }
  if (x == 1) {
    cout << "YES" << endl;
    for (long long i = 0; i < n; i++) {
      cout << a[i] << " ";
    }
    cout << endl;
    return true;
  }
  return false;
}
long long rec(long long n, long long k) {
  if (n == 1) {
    return 1;
  }
  if (k == 1) {
    return n;
  }
  return ((n + rec(n - 1, k - 1)) % 1000000007);
}
bool isPerfectSquare(long long x) {
  if (sqrt(x) * sqrt(x) == x) {
    return true;
  }
  return false;
}
bool isSubSequence(string str1, string str2, int m, int n) {
  int j = 0, x = 0, d = 0;
  if (str1[0] == str2[0]) {
    for (int i = 0; i < n && j < m; i++) {
      if (str1[j] == str2[i]) {
        j++;
      } else {
        d = i;
        break;
      }
    }
    if (j == m) {
      return true;
    }
    long long p = 9, v = 0;
    for (int i = n - 1; i >= d; i--) {
      if (v == 10 - j) {
        break;
      }
      if (str1[p] == str2[i]) {
        p--;
        v++;
      } else {
        break;
      }
    }
    if (v + j == 10) {
      return true;
    } else {
      return false;
    }
  } else {
    size_t found = str2.find(str1);
    if (found != string::npos && str1[9] == str2[n - 1]) {
      return true;
    } else {
      return false;
    }
  }
}
long long countBits(long long n) {
  long long count = 0;
  while (n) {
    count++;
    n >>= 1;
  }
  return count;
}
void kFactors(int n, int k) {
  vector<int> P;
  while (n % 2 == 0) {
    P.push_back(2);
    n /= 2;
  }
  for (int i = 3; i * i <= n; i = i + 2) {
    while (n % i == 0) {
      n = n / i;
      P.push_back(i);
    }
  }
  if (n > 2) P.push_back(n);
  if (P.size() < k) {
    cout << "-1" << endl;
    return;
  }
  for (int i = 0; i < k - 1; i++) cout << P[i] << " ";
  int product = 1;
  for (int i = k - 1; i < P.size(); i++) product = product * P[i];
  cout << product << endl;
}
long long fin(long long n) {
  long long x = 0, y = 0, z = 0;
  for (long long i = 2; i <= n; i++) {
    if (n % i == 0 && x == 0) {
      x = i;
      n /= i;
    } else if (n % i == 0 && y == 0) {
      y = i;
      n /= i;
      if (n != y && n != 1 && x != y && x != n) {
        z = n;
        cout << "YES" << endl;
        cout << x << " " << y << " " << z << endl;
        return 0;
      } else {
        break;
      }
    }
  }
  cout << "NO" << endl;
  return 0;
}
bool sov(long long a[500][500], long long n, long long m) {
  map<long long, vector<long long>> make_pair;
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      make_pair[j - i].push_back(a[i][j]);
    }
  }
  for (auto i : make_pair) {
    for (long long j = 1; j < i.second.size(); j++) {
      if (i.second[j] != i.second[0]) return false;
    }
  }
  return true;
}
int main() {
  int t;
  t = 1;
  while (t--) {
    long long n, k;
    cin >> n >> k;
    if (k > n || (k == 1 && n != 1)) {
      cout << -1;
    } else {
      vector<char> s;
      char p = 'a';
      for (long long i = 0; i < n - k + 2; i++) {
        if (i % 2 == 0) {
          s.push_back(p);
        } else {
          s.push_back('b');
        }
      }
      p = 'c';
      for (long long i = n - k + 2; i < n; i++) {
        s.push_back(p);
        p++;
      }
      for (long long i = 0; i < n; i++) {
        cout << s[i];
      }
    }
  }
  return 0;
}

```