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 C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;
using System.Runtime.CompilerServices;
using static MyUtil;

class MyUtil
{
    public static long[] ReadLongArray()
    {
	return ReadLine().Split().Select(x => long.Parse(x)).ToArray();
    }

    public static long Gcd(long a, long b)
    {
	if (a < b){ return Gcd(b, a); }
	while (b != 0)
	{
	    var r = a % b;
	    a = b;
	    b = r;
	}
	return a;
    }
}

class Program
{
    static int checkChar(string s, long L, long i)
    {
	int n = s.Length;
	long a = L / n;
	if (i % a == 0)
	{
	    return (int) s[(int)(i/a)];
	}
	else
	{
	    return -1;
	}
    }

    static bool check(string s, string t, long L)
    {
	int m = t.Length;
	for (int i = 0; i < m; i++)
	{
	    long a = (int) (L / m);
	    int c = checkChar(s, L, i*a);
	    if (c > 0 && c != (int) t[i])
		return false;
	}
	return true;
    }
    
    public static void Main()
    {
	var tmp = ReadLongArray();
	long n = tmp[0], m = tmp[1];
	long g = n * m / Gcd(n, m);

	string s = ReadLine();
	string t = ReadLine();


	int l = 0;
	int r = (int) Gcd(n, m);

	if (!check(s, t, n*m))
	{
	    WriteLine(-1);
	    return;
	}
	
	while (r - l > 1)
	{
	    int mid = (l + r) / 2;
	    long L = g * mid;

	    if (check(s, t, L))
		r = mid;
	    else
		l = mid;
	}
	WriteLine(r*g);
    }
}