// C++(GCC 9.2.1)
// 解き直し.
// https://atcoder.jp/contests/arc108/editorial/348
#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
using vvi = vector<vi>;
using P = pair<int, int>;
#define repex(i, a, b, c) for(int i = a; i < b; i += c)
#define repx(i, a, b) repex(i, a, b, 1)
#define rep(i, n) repx(i, 0, n)
#define repr(i, a, b) for(int i = a; i >= b; i--)
#define pb push_back
#define a first
#define b second

int main(){
    
    // 1. 入力情報.
    int N, M;
    scanf("%d %d", &N, &M);
    vvi G(N);
    map<P, int> m; // グラフの辺情報(最大一つ)を保存.
    rep(i, M){
        int u, v, c;
        scanf("%d %d %d", &u, &v, &c);
        u--, v--;
        G[u].pb(v);
        G[v].pb(u);
        m[{u, v}] = c;
        m[{v, u}] = c;
    }    
    
    // 2. 頂点 1 から 各頂点までの距離を計算.
    // https://ja.wikipedia.org/wiki/幅優先探索
    function<void(vvi&, int, int*)> bfs = [&](vvi &G, int s, int* d){
        // 2-1. 空のキュー.
        queue<int> q;
        
        // 2-2. 探索地点 s をキュー q に追加.
        q.push(s);
        while(!q.empty()){
            // 2-3. キューから取り出す.
            int u = q.front();
            q.pop();
            
            // 2-4. 取り出した要素を処理.
            for(auto &e : G[u]){
                // 2-5. 訪問済であれば, 処理をスキップ.
                if(d[e])            continue;
                if(!d[e] && e != s) d[e] = d[u] + 1, q.push(e);
            }
        }
        return;
    };
    int d[N];
    memset(d, 0, sizeof(d));
    bfs(G, 0, d);
    // rep(i, N) printf("d[%d]=%d\n", i, d[i]);
    
    // 3. 頂点 1 から 近い順 に並び替え.
    // -> {距離, 頂点番号}
    priority_queue<P, vector<P>, greater<P>> pq;
    rep(i, N) pq.push({d[i], i});
    
    // 4. 各頂点に, 整数を書き込む.
    int ans[N];
    memset(ans, 0, sizeof(ans));
    ans[0] = 1; //  頂点 1 に 1 を書き込む.
    while(!pq.empty()){
        // 4-1. 頂点 v を一つ取り出す.
        P p = pq.top();
        pq.pop();
        
        // 4-2. 頂点 v の 頂点番号は？
        int v = p.b;
        
        // 4-3. 頂点 v を 根とする部分木 について, 整数を書き込む.
        for(auto &u : G[v]){
            // 4-4. 頂点 v に 書き込まれた整数.
            int nv = ans[v];
            
            // 4-5. 頂点 v の 子供 に 相当する頂点 u を 選択し, 書き込み.
            if(d[u] > d[v] && !ans[u]){
                // 4-6. 辺のラベル.
                int ne = m[{v, u}];
                
                // 4-7. 辺のラベルと比較して, 書き込む整数を選択.
                if(nv == ne) ans[u] = (nv == 1) ? N : 1;
                else         ans[u] = ne;
                
            }
        }
    }
    
    // 5. 出力.
    rep(i, N) printf("%d\n", ans[i]);
    return 0;
    
}
// Author : Sarthak Kapoor
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define int ll
#define rep(i,n) for(int i=0;i<n;++i)
#define repa(i,a,n) for(int i=a;i<n;++i)
#define repr(i,n) for(int i=n-1;i>=0;--i)
#define ll long long
#define pi pair<int,int> 
#define pii pair<pi,int>
#define vi vector<int>
#define pb push_back 
#define fi first
#define sec second
#define all(v) v.begin(),v.end()
#define s(v) v.size()
ll mod = 1000000007;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());//use rng()%n for numbers in range [0,n-1]
ll gcd(ll a,ll b){
	if(b==0)return a;
	return gcd(b,a%b);
}
ll fastexp(ll x,ll a){
    ll res = 1;
    while(a>0){
        if(a&1){
            res = (res*x)%mod;
        }
        a=a>>1;
        x=(x*x)%mod;
    }
    return res;
}
ll inverse(ll n){
    return fastexp(n,mod-2);
}
template <typename T>
void add(T &a, T b){
	a += b;
	if(a >= mod)a -= mod;
}
template <typename T>
void sub(T &a, T b){
	a -= b;
	if(a < 0)a += mod;
}
template <typename T>
void mul(T &a, T b){
	a *= b;
	if(a >= mod)a %= mod;
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,x;
	cin>>n>>x;
	vi v(n);
	rep(i,n){
		cin>>v[i];
	}
	map<int,int> mp;
	mp[x] = 1;
	rep(i,n-1){
		map<int,int> newmp;
		for(auto x:mp){
			// x.fi ke sabse pass vaale 2 numbers which
			// are divisible by v[i+1] (might be 1)
			int num = x.fi;
			int r = num%v[i+1];
			if(r == 0){
				newmp[num] += x.sec;
			}
			else{
				newmp[num-r] += x.sec;
				newmp[num+v[i+1]-r] += x.sec;
			}
		}
		mp = newmp;
	}
	int ans = 0;
	for(auto x:mp){
		ans += x.sec;
	}
	cout<<ans;
	return 0;
}