#include <bits/stdc++.h>
using namespace std;

// #include <atcoder/all>
// using namespace atcoder;

#define rep(i,n) for (int i = 0; i < (n); ++i)
using ll = long long;

bool ok(long long N, std::string &S, std::vector<long long> &A, int m) {
    rep (i, m) {
        vector<ll> tmp(N+1);
        rep(j, N+1) {
            tmp[j] = A[j] / m;
            if (i < A[j] % m) {
                tmp[j]++;
            }
        }
        rep(j, N) {
            if (
                (S[j] == '>' && !(tmp[j] > tmp[j+1])) ||
                (S[j] == '<' && !(tmp[j] < tmp[j+1]))
            ) {
                return 0;
            }
        }
    }
    return 1;
}

void solve(long long N, std::string S, std::vector<long long> A){
    int l = 1, r = 10000+1;
    while (r - l > 1) {
        int m = (l + r) / 2;
        if (ok(N, S, A, m)) {
            l = m;
        } else {
            r = m;
        }
    }
    cout << l << endl;
    rep(i, l) {
        rep(j, N+1) {
            int tmp = A[j] / l;
            if (i < A[j] % l) {
                tmp++;
            }
            cout << tmp << ((j == N) ? "\n" : " ");
        }
    }

    // vector<ll> B(N+1);
    // ll mn = 0;
    // vector<int> gts(N+1);
    // vector<int> lts(N+1);
    // rep(i, N) {
    //     if (S[i] == '<') {
    //         lts[i+1] = lts[i] + 1;
    //     } else {
    //         lts[i+1] = 0;
    //     }
    // }
    // for (int i = N-1; i >= 0; i--) {
    //     if (S[i] == '>') {
    //         gts[i] = gts[i+1] + 1;
    //     } else {
    //         gts[i] = 0;
    //     }
    // }
    // rep(i, N+1) {
    //     B[i] = max(gts[i], lts[i]);
    // }
    // vector<vector<ll>> ans;
    // while (1) {
    //     vector<ll> rest = A;
    //     int ok = 1;
    //     rep(i, N+1) {
    //         if (A[i] >= B[i]) {
    //             A[i] -= B[i];
    //         } else {
    //             ok = 0;
    //             break;
    //         }
    //     }
    //     if (ok) {
    //         rep(i, N) {
    //             if (
    //                 (S[i] == '>' && !(A[i] > A[i+1])) ||
    //                 (S[i] == '<' && !(A[i] < A[i+1]))
    //             ) {
    //                 ok = 0;
    //                 break;
    //             }
    //         }
    //     }
    //     if (!ok) {
    //         ans.push_back(rest);
    //         break;
    //     }
    //     ans.push_back(B);
    // }
    // cout << ans.size() << endl;
    // rep(i, ans.size()) {
    //     rep(j, ans[i].size()) {
    //         cout << ans[i][j] << ((j == ans[i].size() - 1) ? "\n" : " ");
    //     }
    // }

}

// Generated by 1.1.7.1 https://github.com/kyuridenamida/atcoder-tools
int main(){
    long long N;
    scanf("%lld",&N);
    std::string S;
    std::cin >> S;
    std::vector<long long> A(N-0+1);
    for(int i = 0 ; i < N-0+1 ; i++){
        scanf("%lld",&A[i]);
    }
    solve(N, S, std::move(A));
    return 0;
}

#include <bits/stdc++.h>
#define ALL(A) (A).begin(), (A).end()
#define ll long long
#define rep(i, n) for (int i = 0; i < (n); i++)

using namespace std;
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

int dx[] = { 0, 1, -1, 0, 1, -1, 1, -1 };  // i<4:4way i<8:8way
int dy[] = { 1, 0, 0, -1, 1, -1, -1, 1 };

const ll mod = 1e9 + 7;
const ll INF = -1 * ((1LL << 63) + 1);
const int inf = -1 * ((1 << 31) + 1);

int main(void){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
    int n;
    cin >> n;
    string s;
    cin >> s;
    vector<int> a(n+1);
    rep(i,n+1)cin >> a[i];
    int k = 1e9+7;
    for(int i=0;i<n;i++){
        chmin(k,abs(a[i] - a[i+1]));
    }
    cout << k << endl;
    for(int j=0;j<k;j++){
        for(int i=0;i<=n;i++){
            if(j < a[i] % k){
                cout << (a[i] + k - 1)/k << " ";
            }else{
                cout << a[i]/k << " ";
            }
        }
        cout << endl;
    }
}