#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;
}

#define _USE_MATH_DEFINES
#include <iostream>
#include <sstream>
#include <string>
#include <list>
#include <vector>
#include <queue>
#include <algorithm>
#include <climits>
#include <cstring>
#include <cmath>
#include <stack>
#include <iomanip>
#include <tuple>
#include <functional>
#include <cfloat>
#include <map>
#include <set>
#include <array>
#include <stdio.h>
#include <string.h>
#include <random>
#include <cassert>
using ll = long long;
using ull = unsigned long long;
using uint = unsigned int;
using namespace std;
#define int long long
#define CONTAINS_VEC(v,n) (find((v).begin(), (v).end(), (n)) != (v).end())
#define SORT(v) sort((v).begin(), (v).end())
#define RSORT(v) sort((v).rbegin(), (v).rend())
#define ARY_SORT(a, size) sort((a), (a)+(size))
#define REMOVE(v,a) (v.erase(remove((v).begin(), (v).end(), (a)), (v).end()))
#define REVERSE(v) (reverse((v).begin(), (v).end()))
#define ARY_REVERSE(v,a) (reverse((v), (v)+(a)))
#define REP(i, n) for (int (i)=0; (i) < (n); (i)++)
#define REPE(i, n) for (int (i)=0; (i) <= (n); (i)++)
#define CONTAINS_MAP(m, a) ((m).find((a)) != m.end())
#define CONTAINS_SET(m, a) ((m).find((a)) != m.end())
void YesNo(bool b) { cout << (b ? "Yes" : "No") << endl; exit(0); }
void Yes() { cout << "Yes" << endl; exit(0); }
void No() { cout << "No" << endl; exit(0); }


int N;
string S;
int A[110];
int _m[110];

signed main()
{
	cin >> N;
	cin >> S;
	REP(i, N + 1) cin >> A[i];

	int k = INT_MAX;
	for (int i = 0; i < N; i++)
	{
		int diff = abs(A[i] - A[i + 1]);
		k = min(diff, k);
	}

	for (int i = 0; i < N + 1; i++)
	{
		_m[i] = A[i] % k;
	}


	cout << k << endl;
	for (int i = 0; i < k; i++)
	{
		for (int i = 0; i < N + 1; i++)
		{
			int m = _m[i] > 0 ? 1 : 0;
			cout << A[i] / k + m << " ";
			_m[i]--;
		}
		cout << endl;
	}
}


