// - YDK - {{{
#include <bits/stdc++.h>
#include <map>
using namespace std;
#define eb          emplace_back
#define emp         emplace
#define fi          first
#define se          second
#define debug(...)  fprintf(stderr, __VA_ARGS__ )
#define outl(x)     out < (x) < '\n'
#define outl2(x,y)  out < (x) < ' ' < (y) < '\n'
#define endl        '\n'
#define rep(i,n)    for(int i=0; i<(int)(n); ++i)
#define ALL(x)      x.begin(), x.end()
#define _NAMESPACE_YDK_ namespace ydk {
#define _END_NAMESPACE_ }
template<class A, class B>inline bool chmax(A &a, B b){return b>a ? a=b,1 : 0;}
template<class A, class B>inline bool chmin(A &a, B b){return b<a ? a=b,1 : 0;}
using ll  = long long;
using pii = pair<int, int>;
inline bool inside(int x, int y, int W, int H) { return x>=0 && y>=0 && x<W && y<H; }
constexpr int       INF  = 0x3f3f3f3f;
constexpr long long LINF = 0x3f3f3f3f3f3f3f3fLL;
constexpr int dx[] = {1, 0, -1, 0};
constexpr int dy[] = {0, 1, 0, -1};
struct Point: public pii {
    int &x = this->first,   &y = this->second;
    explicit Point(int x=0, int y=0): pii(x, y) {}
};
struct Writer
{
    static constexpr size_t BUFF_SIZE = 1 << 18;
    static char _buf[BUFF_SIZE];
    explicit Writer() { setvbuf(stdout, _buf, _IOFBF, sizeof(_buf)); }
    inline void    ln()         {putchar('\n');}
    inline Writer& operator() (int n)   {printf("%d", n);                return *this;}
    inline Writer& operator() (ll  n)   {printf("%lld", n);              return *this;}
    inline Writer& operator() (char c)  {printf("%c", c);                return *this;}
    inline Writer& operator() (double d){printf("%lf", d);               return *this;}
    inline Writer& operator() (const char* s){printf("%s", s);           return *this;}
    inline Writer& operator() (const string &s){printf("%s", s.c_str()); return *this;}
    inline Writer& operator() (bool f)  {printf("%s", f?"true":"false"); return *this;}
    inline Writer& operator() (void)  {putchar('\n'); return *this;}

    template<class InputIterator>
    inline Writer& operator() (InputIterator first, InputIterator last, const char *space=" ")
    {
        for(; first != last; ++first) {
            (*this)(*first);
            printf("%s", (first+1 == last)? "\n" : space);
        }
        return *this;
    }
};
char Writer::_buf[BUFF_SIZE];
template<class T> inline Writer& operator < (Writer &o, const T &v) { return o(v); }

struct Scanner
{
    char tmp[65536];
    inline Scanner& read(int &n)    {scanf("%d", &n);       return *this;}
    inline Scanner& read(ll  &n)    {scanf("%lld", &n);     return *this;}
    inline Scanner& read(char &c)   {scanf(" %c", &c);      return *this;}
    inline Scanner& read(double &d) {scanf("%lf", &d);      return *this;}
    inline Scanner& read(char *s)   {scanf("%s", s);        return *this;}
    inline Scanner& read(string &s) {scanf("%s",tmp); s=string(tmp); return*this;}
};
template<class T> inline Scanner& operator > (Scanner &in, T &v) { return in.read(v); }
template<class T> inline Scanner& operator , (Scanner &in, T &v) { return in.read(v); }
Writer  out;
Scanner in;
// }}}

_NAMESPACE_YDK_

ll lcm(ll a, ll b)
{
    return a / __gcd(a,b) * b;
}

constexpr int LIM = (int)1e5 * 2;

ll N, M;
ll X;
string s, t;

signed main(void)
{
    cin >> N >> M;
    cin >> s >> t;

    X = lcm(N, M);
    ll n = X / N;
    ll m = X / M;

    debug("X=%lld  n=%lld  m=%lld\n", X, n, m);

    map<ll, char> k;

    for (int i= 0; i < N; ++i) {
        int p = i * n + 1;
        k[p] = s[i];
    }

    for (int i = 0; i< M; ++i) {
        int p = i * m + 1;
        if(k[p] != 0 && k[p] != t[i]) {
            outl(-1);
            return 0;
        }
    }

    outl(X);


    return 0;
}

_END_NAMESPACE_

signed main(void) { return ydk::main(); }



Measured memory_bytes: 10880