Problem:
Score : 300 points

Problem Statement

You are given a string S of length N and another string T of length M.
These strings consist of lowercase English letters.

A string X is called a good string when the following conditions are all met:

Let L be the length of X. L is divisible by both N and M.

Concatenating the 1-st, (\frac{L}{N}+1)-th, (2 \times \frac{L}{N}+1)-th, ..., ((N-1)\times\frac{L}{N}+1)-th characters of X, without changing the order, results in S.

Concatenating the 1-st, (\frac{L}{M}+1)-th, (2 \times \frac{L}{M}+1)-th, ..., ((M-1)\times\frac{L}{M}+1)-th characters of X, without changing the order, results in T.

Determine if there exists a good string. If it exists, find the length of the shortest such string.

Constraints

1 \leq N,M \leq 10^5

S and T consist of lowercase English letters.

|S|=N

|T|=M

Input

Input is given from Standard Input in the following format:

N M
S
T

Output

If a good string does not exist, print -1; if it exists, print the length of the shortest such string.

Sample Input 1

3 2
acp
ae

Sample Output 1

6

For example, the string accept is a good string.
There is no good string shorter than this, so the answer is 6.

Sample Input 2

6 3
abcdef
abc

Sample Output 2

-1

Sample Input 3

15 9
dnsusrayukuaiia
dujrunuma

Sample Output 3

45

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Time Limit Exceeded)

import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) {
		try{
			InputStreamReader isr =new InputStreamReader(System.in);
	   		BufferedReader br =new BufferedReader(isr);
	        String buf = br.readLine();
	        StringTokenizer st = new StringTokenizer(buf," ");
	    	final int n = Integer.parseInt(st.nextToken());
	        final int m = Integer.parseInt(st.nextToken());
	        if (n < 1 || m < 1 || m > 100000 || m > 100000) {
	        	throw new IllegalArgumentException();
	        }
	        String s = br.readLine();
	        String t = br.readLine();
	        if (s.length() != n || t.length() != m) {
	        	throw new IllegalArgumentException();
	        }
	        // a: n, m のどちらでも割り切れる最小の数(最小公倍数)
	        int a = -1;
	        int i = 1;
	        while (i != Integer.MAX_VALUE) {
	        	if (i % n == 0 && i % m == 0) {
	        		a = i;
	        		break;
	        	}
	        	i++;
	        }
	        if (a == -1) {
	        	throw new IllegalArgumentException();
	        }
	        i = a;
	        while (i < Integer.MAX_VALUE - a) {
	        	if (isExistGoodString(i, s, t)) {
	        		System.out.println(i);
	        		break;
	        	}
	        	i += a;
	        }
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} catch (IllegalArgumentException iae) {
			iae.printStackTrace();
			System.err.println("1 ≦ N, M ≦ 10^5 を満たす必要があります。");
		}
	}

	private static boolean isExistGoodString(final int i, final String s, final String t) throws IllegalArgumentException {
		if (i < 1) {
	        throw new IllegalArgumentException();
	    }
		char[] x = new char[i];
		int j = 0;
		int n = s.length();
		int m = t.length();
		while (j < x.length) {
			x[j] = '0';
			j++;
		}
		j = 0;
		while (j < n) {
			x[i / n * j] = s.charAt(j);
			j++;
		}
		j = 0;
		while (j < m) {
			if (x[i / m * j] == '0') {
				x[i / m * j] = t.charAt(j);
			} else if (x[i / m * j] != t.charAt(j)) {
				return false;
			}
			j++;
		}
		return true;
	}
}