#include <stdio.h>

int main() {
	int A, B; 
	scanf("%d %d", &A, &B);
	
	int length = A + B + 1, cnt = 0;
	char S[50];
	scanf("%s", S);
	
	if (S[A] == '-') {
		for(int i = 0; i < length; i++) {
			if (S[i] >= '0' && S[i] <= '9') {
				cnt++;
			}
		}
		if (cnt == length -1) {
			printf("Yes\n");
		} else {
			printf("No\n");
		}
	} else {
			printf("No\n");
		}	
	return 0;
}
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,fma,abm,mmx,avx,avx2,tune=native")
#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#ifdef rd
#define trace(...) cout<<"Line:"<<__LINE__<<" "; __f(#__VA_ARGS__, __VA_ARGS__)
template<typename Arg1>
void __f(const char *name, Arg1 &&arg1) {
	cout<<name<<" : "<<arg1<<endl;
}
template<typename Arg1, typename ... Args>
void __f(const char *names, Arg1 &&arg1, Args &&... args) {
	const char *comma=strchr(names+1,',');
	cout.write(names,comma-names)<<" : "<<arg1<<" | ";
	__f(comma+1,args...);
}
#else
#define trace(...)
#define endl '\n'
#endif
#define pb push_back
#define fi first
#define se second
#define int long long
typedef long long ll;
typedef float f80;
#define double long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define sz(x) ((long long)x.size())
#define fr(a,b,c) for(int a=b; a<=c; a++)
#define rep(a,b,c) for(int a=b; a<c; a++)
#define trav(a,x) for(auto &a:x)
#define all(con) con.begin(),con.end()
const ll infl=0x3f3f3f3f3f3f3f3fLL;
const int infi=0x3f3f3f3f;
const int mod=998244353;
//const int mod=1000000007;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> oset;
auto clk=clock();
mt19937_64 rang(chrono::high_resolution_clock::now().time_since_epoch().count());
int rng(int lim) {
	uniform_int_distribution<int> uid(0,lim-1);
	return uid(rang);
}
int powm(int a, int b) {
	int res=1;
	while(b) {
		if(b&1)
			res=(res*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return res;
}

const int N=3e6+5;
int fact[N],ifact[N];
inline int ncr(int n,int r) {
	if(n<r||r<0)
		return 0;
	return (((fact[n]*ifact[r])%mod)*ifact[n-r])%mod;
}
inline int idf(int n, int r) {
	return ncr(n+r-1,r-1);
}
int vals[N];
void solve() {
	fact[0]=1;
	rep(i,1,N)
		fact[i]=(fact[i-1]*i)%mod;
	ifact[N-1]=powm(fact[N-1],mod-2);
	for(int i=N-2; i>=0; i--)
		ifact[i]=(ifact[i+1]*(i+1))%mod;
	int n,m;
	cin>>n>>m;
	int ans=idf(3*m,n);
	for(int i=2*m+1; i<=3*m; i++) {
		ans=(ans-n*idf(3*m-i,n-1))%mod;
	}
	for(int i=m+2; i<=3*m; i+=2) {
		ans=(ans-ncr(n,i)*idf((3*m-i)/2,n))%mod;
	}
	if(ans<0)
		ans+=mod;
	cout<<ans<<endl;
}

signed main() {
	ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	srand(chrono::high_resolution_clock::now().time_since_epoch().count());
	cout<<fixed<<setprecision(10);
	int t=1;
//	cin>>t;
	fr(i,1,t)
	{
		solve();
	}
#ifdef rd
	cout<<endl<<endl<<endl<<endl<<"Time elapsed: "<<(double)(clock()-clk)/CLOCKS_PER_SEC<<endl;
#endif
	return 0;
}
