//競技命令に必要な命令を網羅的に追加
//#include "bits/stdc++.h"
//入出力等基本
#include <iostream>
//文字列
#include <string>
//配列
#include <vector>
//配列操作
#include <algorithm>
//箱型構造
#include <stack>
//筒型構造
#include <queue>
//二分探索木
#include <set>
//平衡二分木
#include <map>
//数学
#include <cmath>
//真表明用
#include <cassert>


//英語を漢字に翻訳
#define 中心() main()
#define 返値 return
#define 入力(a) cin >> a
#define 出力(a) cout << a << endl

//論理
#define 如果(a) if(a)
#define 如他(a) else if(a)
#define 残他 else

//再起
#define 再帰(s,t) for(整数 s = 0; s < 整数(t); s += 1)
#define 逆再(s,t) for(整数 s = 整数(t) - 1; s >= 0; s -= 1)
#define 間帰(s,t,u) for(整数 s = t; s < 整数(u); s += 1)
#define 逆間(s,t,u) for(整数 s = 整数(u) - 1; s >= t; s -= 1)
#define 場合(a) while(a)
#define 脱出 break
#define 次周 continue

//配列操作
#define 最初(h) (h).begin()
#define 最後(h) (h).end()
#define 全部(h) (h).begin(), (h).end()
#define 整理(a,b) sort(a,b)
#define 逆順(a,b) reverse(a,b)
#define 消去(h,a,b) h.erase(a,b)
#define 重複(a,b) unique(a,b)
#define 以上(a,b,c) lower_bound(a,b,c)
#define 比較大(a,b,c) upper_bound(a,b,c)
#define 変長(h,s) h.resize(s)
#define 置換(a,b,c) fill(a,b,c)
#define 全出力(h) for_each(全部(h), [](整数 s) {出力(s);});

//操作
#define 付加(a,b) a.push_back(b)
#define 追加(a,b) a.push(b)
#define 取捨(a) a.pop()
#define 組成(a,b) make_pair(a,b)
#define 交換(a,b) swap(a,b)
#define 挿入(a,b) a.insert(b)
#define 削除(a,b) a.erase(b)

//詳細
#define 先頭(a) a.top()
#define 前面(a) a.front()
#define 空(a) a.empty()
#define 大小(a) a.size()
#define 長短(a) a.length()
#define 先(a) a.first
#define 後(a) a.second
#define 部分文字列(m,s,t) m.substr(s,t)
#define 検索(a,b) a.find(b)
#define 探索(a,b,c) find(a,b,c)
#define 地点(a,b) a.at(b)

//数学系
#define 真 true
#define 偽 false
#define 定数 const
#define 絶対値(a) abs(a)
#define 切下(a) floor(a)
#define 切上(a) ceil(a)
#define 根(a) sqrt(a)
#define 和 +
#define 差 -
#define 積 *
#define 商 /
#define 余 %
#define 且 &&
#define 共 &
#define 亦 ||
#define 又 |
#define 是 =
#define 是不是 ==
#define 不是 !=
#define 是大 >
#define 是小 <
#define 是以上 >=
#define 是以下 <=
#define 増桁 <<
#define 減桁 >>
//#define 不 !

//他
#define 構造体 struct
#define 記号 operator
#define 自動 auto
#define 表明(a) assert(a)
#define 反復子 iterator

//stdの中で作業
using namespace std;

//型を漢字に翻訳
typedef int 整;
typedef void 無;
typedef long long 整数;
typedef vector<整数> 整数配列;
typedef vector<整数配列> 二次元整数配列;
typedef vector<二次元整数配列> 三次元整数配列;
typedef long double 小数;
typedef vector<long double> 小数配列;
typedef vector<小数配列> 二次元小数配列;
typedef char 文字;
typedef vector<文字> 文字配列;
typedef vector<文字配列> 二次元文字配列;
typedef string 文字列;
typedef vector<文字列> 文字列配列;
typedef pair<整数,整数> 整組;
typedef vector<整組> 整組配列;
typedef pair<小数,小数> 小組;
typedef vector<小組> 小組配列;
typedef vector<小組配列> 二次元小組配列;
typedef bool 真偽;
typedef vector<真偽> 真偽配列;
typedef vector<真偽配列> 二次元真偽配列;
typedef stack<整数> 整箱;
typedef queue<整数> 整筒;
typedef queue<整組> 整組筒;
typedef priority_queue<整数> 整順位二分木;
typedef greater<整数> 整昇順;
typedef priority_queue<整数,整数配列,整昇順> 整昇順位二分木;
typedef set<整数> 整二分探索木;
typedef map<整数,整数> 整辞書;
typedef map<整数,定数 文字列> 文字列辞書;

//定数 整数 四方横[4] 是 {1,0,-1,0};
//定数 整数 四方縦[4] 是 {0,1,0,-1};

整数 大値(整数 一, 整数 二){返値 max(一,二);}
整数 小値(整数 一, 整数 二){返値 min(一,二);}

//定数 整数 無限 = (2e9) + 10;
//定数 整数 法 = 1000000007;
//定数 整数 境界 = 1e-9;

整数 長一,長二;
文字列 文字列一,文字列二;

整数 最大公約数(整数 一,整数 二)
{
    如果(二 是不是 0) 返値 一;
    返値 最大公約数(二, 一 余 二);
}

無 入力関数()
{
    入力(長一);
    入力(長二);
    入力(文字列一);
    入力(文字列二);
}

整数 求良文字列()
{
    整数 公約数 = 最大公約数(長一,長二);
    再帰(数,公約数)
    {
        如果(文字列一[長一/公約数 積 数] 不是 文字列二[長二/公約数 積 数])
        {
            返値 -1;
        }
    }
    返値 長一 積 長二 商 公約数;
}
            

整 中心()
{
	入力関数();
    出力(求良文字列());
	返値 0;
}


Measured memory_bytes: 512