#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
int main() {
  int n;
  cin >> n;
  string s, t;
  cin >> s >> t;
  deque<int> targ;
  int mx = 0;
  for (int i = 0; i < n; ++i) {
    int j;
    char u = s[i];
    for (j = mx; j < n; ++j)
      if (u == t[j]) break;
    if (j == n) {
      cout << "-1\n";
      return 0;
    }
    targ.push_back(j);
    t[j] = '0';
    if (j == mx) ++mx;
  }
  vector<bool> ret(n, false);
  vector<int> prec(n);
  vector<int> next(n);
  vector<int> l(n, 1);
  vector<int> sol;
  for (int i = 0; i < n; ++i) {
    prec[i] = i - 1;
    next[i] = i + 1;
  }
  while (targ.size() > 1) {
    int u = targ.front();
    int v = prec[u];
    if (v != -1)
      if ((l[u] == 1 || !ret[u]) && (l[v] == 1 || ret[v])) {
        deque<int> t;
        int a;
        int s = l[v];
        while ((a = targ.back()) != v) {
          t.push_back(a);
          targ.pop_back();
          ret[a] = !ret[a];
          s += l[a];
        }
        sol.push_back(s);
        l[u] += l[v];
        prec[u] = prec[v];
        if (prec[u] != -1) next[prec[u]] = u;
        ret[u] = false;
        targ.pop_back();
        while (!t.empty()) {
          targ.push_front(t.back());
          t.pop_back();
        }
        continue;
      }
    v = next[u];
    if (v != n)
      if ((l[u] == 1 || ret[u]) && (l[v] == 1 || !ret[v])) {
        deque<int> t;
        int a;
        int s = l[v];
        while ((a = targ.back()) != v) {
          t.push_back(a);
          targ.pop_back();
          ret[a] = !ret[a];
          s += l[a];
        }
        sol.push_back(s);
        l[u] += l[v];
        next[u] = next[v];
        if (next[u] != n) prec[next[u]] = u;
        ret[u] = true;
        targ.pop_back();
        while (!t.empty()) {
          targ.push_front(t.back());
          t.pop_back();
        }
        continue;
      }
    u = targ.back();
    v = prec[u];
    if (v != -1)
      if ((ret[u] || l[u] == 1) && (!ret[v] || l[v] == 1)) {
        deque<int> t;
        int a;
        int s = 0;
        do {
          a = targ.back();
          t.push_back(a);
          targ.pop_back();
          ret[a] = !ret[a];
          s += l[a];
        } while (a != v);
        sol.push_back(s);
        while (!t.empty()) {
          targ.push_front(t.back());
          t.pop_back();
        }
        continue;
      }
    v = next[u];
    if (v != n)
      if ((!ret[u] || l[u] == 1) && (ret[v] || l[v] == 1)) {
        deque<int> t;
        int a;
        int s = 0;
        do {
          a = targ.back();
          t.push_back(a);
          targ.pop_back();
          ret[a] = !ret[a];
          s += l[a];
        } while (a != v);
        sol.push_back(s);
        while (!t.empty()) {
          targ.push_front(t.back());
          t.pop_back();
        }
        continue;
      }
    sol.push_back(l[u]);
    targ.push_front(u);
    targ.pop_back();
    ret[u] = !ret[u];
  }
  if (ret[targ.front()]) sol.push_back(n);
  cout << sol.size() << "\n";
  for (int i = 0; i < sol.size(); ++i) {
    if (i > 0) cout << " ";
    cout << sol[i];
  }
  cout << "\n";
  return 0;
}
