#include <bits/stdc++.h>
using namespace std;
bool deb_mode = 0;
class debugger {
  vector<string> vars;

 public:
  template <typename T>
  debugger &operator,(const T v) {
    stringstream ss;
    ss << v, vars.push_back(ss.str());
    return *this;
  }
  void printall() {
    int j = 0, l = vars.size();
    for (int i = 0; i < (l - 1); i++) {
      if (i) cout << ", ";
      for (j; j < vars[l - 1].size(); j++) {
        if (vars[l - 1][j] == ',') {
          j++;
          break;
        }
        cout << vars[l - 1][j];
      }
      cout << " = " << vars[i];
    }
    vars.clear();
  }
} Dbug;
template <typename T1, typename T2>
inline ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << "(" << p.first << "," << p.second << ")";
}
template <typename T>
inline ostream &operator<<(ostream &os, const vector<T> &v) {
  bool first = true;
  os << "{";
  for (unsigned int i = 0; i < v.size(); i++) {
    if (!first) os << ",";
    os << v[i];
    first = false;
  }
  return os << "}";
}
template <typename T>
inline ostream &operator<<(ostream &os, const set<T> &v) {
  bool first = true;
  os << "{";
  for (typename set<T>::const_iterator ii = v.begin(); ii != v.end(); ++ii) {
    if (!first) os << ",";
    os << *ii;
    first = false;
  }
  return os << "}";
}
template <typename T1, typename T2>
inline ostream &operator<<(ostream &os, const map<T1, T2> &v) {
  bool first = true;
  os << "{";
  for (typename map<T1, T2>::const_iterator ii = v.begin(); ii != v.end();
       ++ii) {
    if (!first) os << ",";
    os << *ii;
    first = false;
  }
  return os << "}";
}
template <typename T>
void getarray(T a[], int b, int e) {
  for (int i = b; i < e + b; i++) cin >> a[i];
}
template <typename T>
void printarray(T a[], int b, int e) {
  for (int i = b; i < e - 1 + b; i++) cout << a[i] << " ";
  if (e - 1 + b >= 0) cout << a[e - 1 + b] << endl;
}
template <typename T>
void printV(vector<T> v) {
  int sz = v.size();
  if (sz) cout << v[0];
  for (int i = 1; i < sz; i++) cout << " " << v[i];
  puts("");
}
template <typename T>
T gcd(T a, T b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
template <typename T>
T BigMod(T b, T p, T m) {
  if (p == 0) return 1;
  if (p % 2 == 0) {
    T s = BigMod(b, p / 2, m);
    return ((s % m) * (s % m)) % m;
  }
  return ((b % m) * (BigMod(b, p - 1, m) % m)) % m;
}
template <typename T>
T ModInv(T b, T m) {
  return BigMod(b, m - 2, m);
}
template <class T>
inline void read(T &x) {
  bool Minus = 0;
  char c;
  for (c = getchar(); c <= 32; c = getchar())
    ;
  if (c == '-') Minus = 1, c = getchar();
  for (x = 0; c > 32; c = getchar()) x = x * 10 + c - '0';
  if (Minus) x = -x;
}
char getc() {
  char c;
  for (c = getchar(); c <= 32; c = getchar())
    ;
  return c;
}
int CI(int &_x) { return scanf("%d", &_x); }
int CI(int &_x, int &_y) { return scanf("%d %d", &_x, &_y); }
int CI(int &_x, int &_y, int &_z) { return scanf("%d %d %d", &_x, &_y, &_z); }
int CI(int &_a, int &_b, int &_c, int &_d) {
  return scanf("%d %d %d %d", &_a, &_b, &_c, &_d);
}
template <class T>
string toString(T n) {
  ostringstream oss;
  oss << n;
  return oss.str();
}
int toInt(string s) {
  int r = 0;
  istringstream sin(s);
  sin >> r;
  return r;
}
long long int toLong(string s) {
  long long int r = 0;
  istringstream sin(s);
  sin >> r;
  return r;
}
bool isVowel(char ch) {
  ch = tolower(ch);
  if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
    return true;
  return false;
}
bool isUpper(char c) { return c >= 'A' && c <= 'Z'; }
bool isLower(char c) { return c >= 'a' && c <= 'z'; }
int dr8[8] = {+1, -1, +0, +0, +1, -1, -1, +1};
int dc8[8] = {+0, +0, -1, +1, +1, +1, -1, -1};
int dr4[4] = {+0, +0, +1, -1};
int dc4[4] = {-1, +1, +0, +0};
int kn8r[8] = {+1, +2, +2, +1, -1, -2, -2, -1};
int kn8c[8] = {+2, +1, -1, -2, -2, -1, +1, +2};
const double EPS = 1e-9;
const int INF = (1 << 30) - 1;
const long long int LINF = (1ll << 62) - 1;
const long long int mod = (int)1e9 + 7;
const int MAX = (int)1e5;
string p, t;
int m, n;
int matches[1000000 * 2 + 5];
int b[100000 * 2 + 5];
int match_index;
void kmpPreprocess() {
  if (deb_mode) {
    cout << "Line= " << 227 << " -> ";
    Dbug, p, "p";
    Dbug.printall();
    cout << endl;
  };
  m = p.size();
  int i = 0, j = -1;
  b[i] = j;
  while (i < m) {
    while (j >= 0 && p[i] != p[j]) j = b[j];
    i++;
    j++;
    b[i] = j;
  }
}
void report(int i) { matches[match_index++] = i; }
void kmpSearch() {
  int i = 0, j = 0;
  while (i < n) {
    while (j >= 0 && t[i] != p[j]) j = b[j];
    i++;
    j++;
    if (j == m) {
      report(i - m);
      j = b[j];
    }
  }
}
void Search(string tt, string pp) {
  t = tt;
  p = pp;
  n = tt.length();
  m = pp.length();
  match_index = 0;
  memset(b, 0, sizeof b);
  kmpPreprocess();
}
int main() {
  if (deb_mode) srand(int(time(NULL)));
  int i, j, k, l, n, m, q, a, c;
  vector<int> x_;
  cin >> n >> m;
  cin >> p;
  kmpPreprocess();
  for (i = 0; i < m; i++) {
    cin >> a;
    x_.push_back(a);
  }
  int pl = p.size();
  if (deb_mode) {
    cout << "Line= " << 285 << " -> ";
    Dbug, pl, "pl";
    Dbug.printall();
    cout << endl;
  };
  if (deb_mode) printarray(b, 1, pl);
  int gap = 0;
  int last = 0;
  if (m > 0) {
    gap += (x_[0] - 1);
    last = x_[0];
  }
  if (deb_mode) {
    cout << "Line= " << 293 << " -> ";
    Dbug, gap, last, "gap, last";
    Dbug.printall();
    cout << endl;
  };
  for (i = 1; i < m; i++) {
    int now = x_[i];
    if (deb_mode) {
      cout << "Line= " << 296 << " -> ";
      Dbug, i, now, last, "i, now, last";
      Dbug.printall();
      cout << endl;
    };
    if (now - last >= pl) {
      gap += (now - (last + pl));
      if (deb_mode) {
        cout << "Line= " << 299 << " -> ";
        Dbug, gap, "gap";
        Dbug.printall();
        cout << endl;
      };
    } else {
      int t = now - last + 1;
      while (t > 1) {
        if (deb_mode) {
          cout << "Line= " << 303 << " -> ";
          Dbug, t, "t";
          Dbug.printall();
          cout << endl;
        };
        t = b[t];
      }
      if (t == 1) {
        ;
      } else {
        cout << 0 << "\n";
        return 0;
      }
    }
    last = now;
  }
  if (last + pl > n + 1) {
    if (deb_mode) {
      cout << "Line= " << 316 << " -> ";
      Dbug, last + pl, "last + pl";
      Dbug.printall();
      cout << endl;
    };
    cout << 0 << "\n";
    return 0;
  }
  gap += (n - (last + pl) + 1);
  if (m == 0) gap = n;
  if (deb_mode) {
    cout << "Line= " << 322 << " -> ";
    Dbug, gap, "gap";
    Dbug.printall();
    cout << endl;
  };
  long long int ans = 1ll;
  for (i = 1; i <= gap; i++) {
    ans = (ans * 26) % mod;
  }
  cout << ans << "\n";
  if (deb_mode) cerr << "TIME = " << clock() << " ms" << endl;
  return 0;
}
