Problem: Marina loves strings of the same length and Vasya loves when there is a third string, different from them in exactly t characters. Help Vasya find at least one such string.

More formally, you are given two strings s1, s2 of length n and number t. Let's denote as f(a, b) the number of characters in which strings a and b are different. Then your task will be to find any string s3 of length n, such that f(s1, s3) = f(s2, s3) = t. If there is no such string, print  - 1.

Input

The first line contains two integers n and t (1 ≤ n ≤ 105, 0 ≤ t ≤ n).

The second line contains string s1 of length n, consisting of lowercase English letters.

The third line contain string s2 of length n, consisting of lowercase English letters.

Output

Print a string of length n, differing from string s1 and from s2 in exactly t characters. Your string should consist only from lowercase English letters. If such string doesn't exist, print -1.

Examples

Input

3 2
abc
xyc


Output

ayd

Input

1 0
c
b


Output

-1

Solution (in JAVA):

Solution:
import java.io.*;
import java.util.*;

public class Main {

	static class PairComparator implements Comparator<Pair> {
		@Override
		public int compare(Pair x, Pair y) {
			if (x.val < y.val)
				return -1;
			if (x.val > y.val)
				return 1;
			if (x.val == y.val) {
				if (x.ind < y.ind)
					return -1;
				if (x.ind > y.ind)
					return 1;
			}
			return 0;
		}
	}

	static class Pair {
		int ind, val;

		Pair(int i, int v) {
			ind = i;
			val = v;
		}
	}

	static int[] vis;

	static long sum=0;
	static boolean dfs(int curr, List<Integer >[] tree, int minV, int[] p){
		if (p[curr]==-1){
			int minCurr = Integer.MAX_VALUE;
			for (int i=0;i<tree[curr].size();i++){
				minCurr = Math.min(minCurr, p[tree[curr].get(i)]);	
			}
			p[curr] = minCurr;
		}
		if (p[curr]<minV)return false;
		if (p[curr]!=Integer.MAX_VALUE)sum+=p[curr] - minV;
		for (int i=0;i<tree[curr].size();i++){

			if (!dfs(tree[curr].get(i), tree, p[curr]==-1?minV:p[curr], p)){
				return false;
			}	
		}
		return true;

	}
	static long area(int x1,int y1, int x2, int y2){
		return (long)(y2-y1)*(long)(x2-x1);
	}

	static boolean inside(int[] box, int x, int y){
		if (x>=box[0] && x<=box[2] && y>=box[1] && y<=box[3])return true;
		return false;
	}

	static long areaIntersect(int[] box1, int[] box2){
		int[] swap;
		if (box2[0]<box1[0]){
			swap = box1;
			box1 = box2;
			box2 = swap;
		}
		if (box1[1]>=box2[3] || box1[2]<=box2[0] || box1[3]<=box2[1])return 0;
		long v =  area(Math.max(box1[0], box2[0]), Math.max(box1[1], box2[1]),
				Math.min(box1[2], box2[2]), Math.min(box1[3], box2[3]));
		return v;
	}
	
	static long areaIntersect(int[] box1, int[] box2, int[] box3){
		int[] swap;
		boolean swaped=false;
		if (box2[0]<box1[0]){
			swaped=true;
			swap = box1;
			box1 = box2;
			box2 = swap;
		}
		if (box1[1]>=box2[3] || box1[2]<=box2[0] || box1[3]<=box2[1])return 0;
		int[] newBox = {
				Math.max(box1[0], box2[0]), Math.max(box1[1], box2[1]),
				Math.min(box1[2], box2[2]), Math.min(box1[3], box2[3])
		};

		if (swaped){
			swap = box1;
			box1 = box2;
			box2 = swap;	
		}
		box2=box3;
		if (box2[0]<box1[0]){
			swap = box1;
			box1 = box2;
			box2 = swap;
		}
		if (box1[1]>=box2[3] || box1[2]<=box2[0] || box1[3]<=box2[1])return 0;
		int[] newBox2 = {
				Math.max(box1[0], box2[0]), Math.max(box1[1], box2[1]),
				Math.min(box1[2], box2[2]), Math.min(box1[3], box2[3])
		};
		return areaIntersect(newBox, newBox2);

	}

	static void func() throws Exception {
		int n, t;
		n = sc.nextInt();
		t = sc.nextInt();
		String a = sc.next();
		String b = sc.next();
		int same = 0;
		int nt = n-t;
		char[] res = new char[n];
		int[] vis = new int[n];
		for (int i=0;i<n;i++){
			if (a.charAt(i)==b.charAt(i)){
				same++;
				if (nt!=0){
					res[i] =(char) (a.charAt(i));
					nt--;
					vis[i]++;
				}
			}
		}
		if (nt>(n-same)/2){
			pw.println(-1);
			return;
		}
		if (nt!=0){
			int com = nt;
			for (int i=0;i<n;i++){
				if (com==0)break;
				if (vis[i]==0){
					com--;
					res[i]=a.charAt(i);
					vis[i]++;
				}
			}
			com = nt;
			for (int i=0;i<n;i++){
				if (com==0)break;
				if (vis[i]==0){
					com--;
					res[i]=b.charAt(i);
					vis[i]++;
				}
			}
		}
		for (int i=0;i<n;i++){
			if (vis[i]==0){
				for (int j=0;j<26;j++){
					char curr = (char)('a'+j);
					if (a.charAt(i)!=curr && b.charAt(i)!=curr){
						res[i]=curr;
						vis[i]=1;
						break;
					}
				}
			}
		}
		for (int i=0;i<n;i++){
			pw.print(res[i]);
		}
		

		
	}

	/*
	 
	 * */
	static PrintWriter pw;
	static MScanner sc;

	public static void main(String[] args) throws Exception {

		pw = new PrintWriter(System.out);
		sc = new MScanner(System.in);

		int tests = 1;
	//	tests =sc.nextInt(); //comment this line
		while (tests-- > 0) {
			func();
			pw.flush();
		}

	}

	static class MScanner {
		StringTokenizer st;
		BufferedReader br;

		public MScanner(InputStream system) {
			br = new BufferedReader(new InputStreamReader(system));
		}

		public MScanner(String file) throws Exception {
			br = new BufferedReader(new FileReader(file));
		}

		public String next() throws IOException {
			while (st == null || !st.hasMoreTokens())
				st = new StringTokenizer(br.readLine());
			return st.nextToken();
		}

		public int[] intArr(int n) throws IOException {
			int[] in = new int[n];
			for (int i = 0; i < n; i++)
				in[i] = nextInt();
			return in;
		}

		public long[] longArr(int n) throws IOException {
			long[] in = new long[n];
			for (int i = 0; i < n; i++)
				in[i] = nextLong();
			return in;
		}

		public int[] intSortedArr(int n) throws IOException {
			int[] in = new int[n];
			for (int i = 0; i < n; i++)
				in[i] = nextInt();
			shuffle(in);
			Arrays.sort(in);
			return in;
		}

		public long[] longSortedArr(int n) throws IOException {
			long[] in = new long[n];
			for (int i = 0; i < n; i++)
				in[i] = nextLong();
			shuffle(in);
			Arrays.sort(in);
			return in;
		}

		public Integer[] IntegerArr(int n) throws IOException {
			Integer[] in = new Integer[n];
			for (int i = 0; i < n; i++)
				in[i] = nextInt();
			return in;
		}

		public Long[] LongArr(int n) throws IOException {
			Long[] in = new Long[n];
			for (int i = 0; i < n; i++)
				in[i] = nextLong();
			return in;
		}

		public String nextLine() throws IOException {
			return br.readLine();
		}

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

		public double nextDouble() throws IOException {
			return Double.parseDouble(next());
		}

		public char nextChar() throws IOException {
			return next().charAt(0);
		}

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

		public boolean ready() throws IOException {
			return br.ready();
		}

		public void waitForInput() throws InterruptedException {
			Thread.sleep(3000);
		}
	}

	static void shuffle(int[] in) {
		for (int i = 0; i < in.length; i++) {
			int idx = (int) (Math.random() * (i + 1));
			int tmp = in[i];
			in[i] = in[idx];
			in[idx] = tmp;
		}
	}

	static void shuffle(long[] in) {
		for (int i = 0; i < in.length; i++) {
			int idx = (int) (Math.random() * (i + 1));
			long tmp = in[i];
			in[i] = in[idx];
			in[idx] = tmp;
		}
	}
}