In the beginning of the new year Keivan decided to reverse his name. He doesn't like palindromes, so he changed Naviek to Navick.

He is too selfish, so for a given n he wants to obtain a string of n characters, each of which is either 'a', 'b' or 'c', with no palindromes of length 3 appearing in the string as a substring. For example, the strings "abc" and "abca" suit him, while the string "aba" doesn't. He also want the number of letters 'c' in his string to be as little as possible.

Input

The first line contains single integer n (1 ≤ n ≤ 2·105) — the length of the string.

Output

Print the string that satisfies all the constraints.

If there are multiple answers, print any of them.

Examples

Input

2


Output

aa


Input

3


Output

bba

Note

A palindrome is a sequence of characters which reads the same backward and forward.
import java.util.*;
import java.io.*;
import java.math.*;
public class CFB805 {
public static void main(String args[]) {
	InputReader in = new InputReader(System.in);
	//OutputStream outputStream = System.out;
	PrintWriter out = new PrintWriter(System.out);
	int n=in.nextInt();
	String s="aabb";
	int x=n/4;
	n=n%4;
	for(int i=1;i<=x;i++)
	{
		out.print(s);
	}
	for(int i=0;i<n;i++)
		out.print(s.charAt(i));
	out.close();

}

int sieveOfEratosthenes(int n) {
	// Create a boolean array "prime[0..n]" and initialize
	// all entries it as true. A value in prime[i] will
	// finally be false if i is Not a prime, else true.
	boolean prime[] = new boolean[n + 1];
	for (int i = 0; i < n; i++)
		prime[i] = true;

	for (int p = 2; p * p <= n; p++) {
		// If prime[p] is not changed, then it is a prime
		if (prime[p] == true) {
			// Update all multiples of p
			for (int i = p * 2; i <= n; i += p)
				prime[i] = false;
		}
	}
	int c = 0;
	for (int i = 2; i <= n; i++) {
		if (prime[i] == true)
			c++;
	}
	return c;
	// Print all prime numbers
	/* for(int i = 2; i <= n; i++)
	 {
	     if(prime[i] == true)
	         System.out.print(i + " ");
	 }*/
}

static class Pair implements Comparable<Pair> {
	int u;
	int v;
	BigInteger bi;

	public Pair(int u, int v) {
		this.u = u;
		this.v = v;
	}

	public int hashCode() {
		int hu = (int) (u ^ (u >>> 32));
		int hv = (int) (v ^ (v >>> 32));
		return 31 * hu + hv;
	}

	public boolean equals(Object o) {
		Pair other = (Pair) o;
		return u == other.u && v == other.v;
	}

	public int compareTo(Pair other) {
		return Long.compare(u, other.u) != 0 ? Long.compare(u, other.u) : Long.compare(v, other.v);
	}

	public String toString() {
		return "[u=" + u + ", v=" + v + "]";
	}
}

static long modulo(long a, long b, long c) {
	long x = 1;
	long y = a;
	while (b > 0) {
		if (b % 2 == 1) {
			x = (x * y) % c;
		}
		y = (y * y) % c; // squaring the base
		b /= 2;
	}
	return x % c;
}

public static long getClosestK(long[] a, long x) {

	int low = 0;
	int high = a.length - 1;

	while (low <= high) {
		int mid = (low + high) / 2;

		// test lower case
		if (mid == 0) {
			if (a.length == 1) {
				return a[0];
			}

			return Math.min(Math.abs(a[0] - x), Math.abs(a[1] - x)) + x;
		}

		// test upper case
		if (mid == a.length - 1) {
			return a[a.length - 1];
		}

		// test equality
		if (a[mid] == x || a[mid + 1] == x) {
			return x;
		}

		// test perfect range.
		if (a[mid] < x && a[mid + 1] > x) {
			return Math.min(Math.abs(a[mid] - x), Math.abs(a[mid + 1] - x)) + x;
		}

		// keep searching.
		if (a[mid] < x) {
			low = mid + 1;
		} else {
			high = mid;
		}
	}

	throw new IllegalArgumentException("The array cannot be empty");
}

long factorial(long n, long M) {
	long ans = 1;
	while (n >= 1) {
		ans = (ans * n) % M;
		n--;
	}
	return ans;
}

static long gcd(long x, long y) {
	if (x == 0)
		return y;
	if (y == 0)
		return x;
	long r = 0, a, b;
	a = (x > y) ? x : y; // a is greater number
	b = (x < y) ? x : y; // b is smaller number
	r = b;
	while (a % b != 0) {
		r = a % b;
		a = b;
		b = r;
	}
	return r;
}

static class InputReader {
	public BufferedReader reader;
	public StringTokenizer tokenizer;

	public InputReader(InputStream inputstream) {
		reader = new BufferedReader(new InputStreamReader(inputstream));
		tokenizer = null;
	}

	public String nextLine() {
		String fullLine = null;
		while (tokenizer == null || !tokenizer.hasMoreTokens()) {
			try {
				fullLine = reader.readLine();
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
			return fullLine;
		}
		return fullLine;
	}

	public String next() {
		while (tokenizer == null || !tokenizer.hasMoreTokens()) {
			try {
				tokenizer = new StringTokenizer(reader.readLine());
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}
		return tokenizer.nextToken();
	}

	public long nextLong() {
		return Long.parseLong(next());
	}

	public int nextInt() {
		return Integer.parseInt(next());
	}
}
}
