1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b) for (int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;

#ifdef LOCAL
ostream &operator<<(ostream &out, string str)
{
    for (char c : str)
        out << c;
    return out;
}
template <class L, class R>
ostream &operator<<(ostream &out, pair<L, R> p) { return out << "(" << p.first << ", " << p.second << ")"; }
template <class L, class R, class S>
ostream &operator<<(ostream &out, tuple<L, R, S> p)
{
    auto &[a, b, c] = p;
    return out << "(" << a << ", " << b << ", " << c << ")";
}
template <class T>
auto operator<<(ostream &out, T a) -> decltype(a.begin(), out)
{
    out << '{';
    for (auto it = a.begin(); it != a.end(); it = next(it))
        out << (it != a.begin() ? ", " : "") << *it;
    return out << '}';
}
void dump() { cerr << "\n"; }
template <class T, class... Ts>
void dump(T a, Ts... x)
{
    cerr << a << ", ";
    dump(x...);
}
#define debug(...) cerr << "[" #__VA_ARGS__ "]: ", dump(__VA_ARGS__)
#else
#define debug(...) 42
#endif

main()
{
    cin.tie(0)->sync_with_stdio(0);
    cin.exceptions(cin.failbit);

    int Z = 1;
    // cin >> Z;
    while (Z--)
    {
        int n, m, k;
        cin >> n >> k >> m;
        vector<pair<int, pll>> V(n);
        vi K(k, 0);
        for (auto &[x, y] : V)
            cin >> x >> y.first >> y.second;
        sort(all(V));
        vl DP(m, LONG_LONG_MAX), T(m, LONG_LONG_MAX);
        DP[0] = 0;
        K[V[0].first - 1] = 1;
        for (int i = 0; i < n; i++)
        {
            if (i && V[i].first != V[i - 1].first)
            {
                swap(DP, T);
                for (auto &a : T)
                    a = LONG_LONG_MAX;
                K[V[i].first - 1] = 1;
            }
            for (int j = 0; j < m; j++)
                if (DP[j] != LONG_LONG_MAX)
                    T[(j + V[i].second.first) % m] = min(T[(j + V[i].second.first) % m], DP[j] + V[i].second.second);
        }
        T[0] = 0;
        DP = T;
        bool works = 1;
        for (auto &a : K)
            if (!a)
                works = 0;
        if (!works)
        {
            cout << 0 << endl;
            for (int i = 1; i < m; i++)
                cout << -1 << endl;
            continue;
        }
        for (int i = 1; i < m; i++)
            if (DP[i] != LONG_LONG_MAX)
                for (int j = 2; j < m; j++)
                    T[(i * j) % m] = min(T[(i * j) % m], DP[i] * j);
        for (int i = 1; i < m; i++)
            if (T[i] != LONG_LONG_MAX)
                for (int j = 1; j < m; j++)
                    if (T[j] != LONG_LONG_MAX)
                        T[(i + j) % m] = min(T[(i + j) % m], T[i] + T[j]);
        for (auto &a : T)
        {
            if (a == LONG_LONG_MAX)
                a = -1;
            cout << a << endl;
        }
    }
}