/*
* Language: Standard C++23 [-std=c++23]
* Author: Zang Vũ aka zvwgvx
* Github & Discord & Facebook: @zvwgvx
*/
#pragma GCC optimize("fast-math,O3")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("unroll-loops")
// #pragma GCC optimize("Ofast")
// #pragma GCC target("tune=native")
// #pragma GCC target("avx,avx2,fma")
#include <bits/stdc++.h>
using namespace std;
#define ENV defined(LOCAL)
#define el cout << '\n'
#define rt return
#define ll long long
#define ull unsigned ll
#define pii pair <int, int>
#define pll pair <ll, ll>
#define vi vector <int>
#define vl vector <ll>
#define vc vector <char>
#define vvi vector <vector <int>>
#define vvl vector <vector <ll>>
#define mts multiset
#define mtm multimap
#define ump unordered_map
#define ust unordered_set
#define umts unordered_multiset
#define umtm unordered_multimap
#define priq priority_queue
template <typename T>
T fgcd(T a, T b) {
if (!a || !b) rt a | b;
unsigned shift = __builtin_ctzll(a | b);
a >>= __builtin_ctzll(a);
while (b) {
b >>= __builtin_ctzll(b);
if (a > b) swap(a, b);
b -= a;
}
rt a << shift;
}
template <typename T>
T fpow(T base, T exp, T mod) {
T res = 1;
for (; exp; exp >>= 1, base = base * base % mod)
if (exp & 1) res = res * base % mod;
return res;
}
template <typename T> T lcm(T a, T b) { rt a * (b / fgcd(a, b)); }
template <typename T> void maximize(T& a, T b) { if (a < b) a = b; }
template <typename T> void minimize(T& a, T b) { if (a > b) a = b; }
template <typename T> double lg(T a, T b) { rt log(b) / log(a); }
template <typename T> ull P(T n, T k) { ull res = 1; for (int i = 0; i < k; i++) res *= (n - i); rt res; }
template <typename T> ull C(T n, T k) { ull res = 1; for (int i = 1; i <= k; i++) res = res * (n - i + 1) / i; rt res; }
const int MOD = 1e9 + 7;
const int INF = 1e9;
const int LIMIT = 1e6 + 5;
#if ENV
void open(const string& file) {
freopen((file + ".inp").c_str(), "r", stdin);
freopen((file + ".out").c_str(), "w", stdout);
}
auto start = clock();
void time() { cout << "\n\n[rt] " << 1.0 * (clock() - start) / CLOCKS_PER_SEC; }
#endif
signed main() {
cin.tie(nullptr), cout.tie(nullptr)
-> ios_base::sync_with_stdio(false);
#if ENV
open("main");
srand(time(nullptr));
#endif
int N, K;
cin >> N >> K;
string S, T;
cin >> S >> T;
vector<string> w;
w.push_back(S);
w.push_back(T);
for (int i = 0; i < N; i++){
string tmp;
cin >> tmp;
w.push_back(tmp);
}
int total = w.size();
ump<string, vi> table;
table.reserve(total * 2);
for (int i = 0; i < total; i++){
table[w[i]].push_back(i);
}
vvi g(total);
for (int i = 0; i < total; i++){
string cur = w[i];
for (int pos = 0; pos < K; pos++){
char orig = cur[pos];
for (char c = 'a'; c <= 'z'; c++){
if (c == orig) continue;
cur[pos] = c;
if (table.find(cur) != table.end()){
for (int idx : table[cur]){
g[i].push_back(idx);
}
}
}
cur[pos] = orig;
}
}
vi dist(total, INF);
vl dp(total, 0);
deque<int> dq;
dist[0] = 0;
dp[0] = 1;
dq.push_back(0);
while (!dq.empty()){
int u = dq.front();
dq.pop_front();
int d = dist[u];
for (int v : g[u]){
if (dist[v] > d + 1){
dist[v] = d + 1;
dp[v] = dp[u];
dq.push_back(v);
}
else if (dist[v] == d + 1){
dp[v] = (dp[v] + dp[u]) % MOD;
}
}
}
if (S == T) {
cout << "0 1";
} else if (dist[1] == INF) {
cout << "-1 -1";
} else {
cout << dist[1] << " " << dp[1] % MOD;
}
#if ENV
time();
#endif
rt 0;
}