Problem: And now the numerous qualifying tournaments for one of the most prestigious Russian contests Russian Codec Cup are over. All n participants who have made it to the finals found themselves in a huge m-floored 108-star hotel. Of course the first thought to come in a place like this is "How about checking out the elevator?".

The hotel's elevator moves between floors according to one never changing scheme. Initially (at the moment of time 0) the elevator is located on the 1-st floor, then it moves to the 2-nd floor, then — to the 3-rd floor and so on until it reaches the m-th floor. After that the elevator moves to floor m - 1, then to floor m - 2, and so on until it reaches the first floor. This process is repeated infinitely. We know that the elevator has infinite capacity; we also know that on every floor people get on the elevator immediately. Moving between the floors takes a unit of time.

For each of the n participant you are given si, which represents the floor where the i-th participant starts, fi, which represents the floor the i-th participant wants to reach, and ti, which represents the time when the i-th participant starts on the floor si.

For each participant print the minimum time of his/her arrival to the floor fi. 

If the elevator stops on the floor si at the time ti, then the i-th participant can enter the elevator immediately. If the participant starts on the floor si and that's the floor he wanted to reach initially (si = fi), then the time of arrival to the floor fi for this participant is considered equal to ti.

Input

The first line contains two space-separated integers n and m (1 ≤ n ≤ 105, 2 ≤ m ≤ 108). 

Next n lines contain information about the participants in the form of three space-separated integers si fi ti (1 ≤ si, fi ≤ m, 0 ≤ ti ≤ 108), described in the problem statement.

Output

Print n lines each containing one integer — the time of the arrival for each participant to the required floor.

Examples

Input

7 4
2 4 3
1 2 0
2 2 0
1 2 1
4 3 5
1 2 2
4 2 0


Output

9
1
0
7
10
7
5


Input

5 5
1 5 4
1 3 1
1 3 4
3 1 5
4 2 5


Output

12
10
10
8
7

Note

Let's consider the first sample. The first participant starts at floor s = 2 by the time equal to t = 3. To get to the floor f = 4, he has to wait until the time equals 7, that's the time when the elevator will go upwards for the second time. Then the first participant should get on the elevator and go two floors up. In this case the first participant gets to the floor f at time equal to 9. The second participant starts at the time t = 0 on the floor s = 1, enters the elevator immediately, and arrives to the floor f = 2. The third participant doesn't wait for the elevator, because he needs to arrive to the same floor where he starts.

Solution (in JAVA):

Solution:
import java.io.*; 
import java.math.*; 
import java.util.*; 

public class A { 
final static int MOD = 1000000007; 

public static void main(String[] args) throws Exception { 
FastReader in = new FastReader(System.in); 
int n = in.nextInt(); 
int m = in.nextInt(); 
for (int i = 0; i < n; i++) { 
long s = in.nextLong(); 
long f = in.nextLong(); 
long t = in.nextLong(); 
if (s == f) { 
System.out.println(t); 
continue; 
} 
// Go up 
if (s < f) { 
long k = (long) Math.ceil((((double)t - (double)s + 1) / (m - 1)) / 2.0); 
long arrivalT = (2 * k) * (m - 1) - 1 + f; 
System.out.println(arrivalT); 
} else { // Go down 
long k = (long) Math.ceil((((double)t - (double)m + (double)s) / (m - 1) - 1.0) / 2.0); 
long arrivalT = (2 * k + 1) * (m - 1) + m - f; 
System.out.println(arrivalT); 
} 
} 
} 

static class FastReader { 
private boolean finished = false; 

private InputStream stream; 
private byte[] buf = new byte[1024]; 
private int curChar; 
private int numChars; 
private SpaceCharFilter filter; 

public FastReader(InputStream stream) { 
this.stream = stream; 
} 

public int read() { 
if (numChars == -1) { 
throw new InputMismatchException(); 
} 
if (curChar >= numChars) { 
curChar = 0; 
try { 
numChars = stream.read(buf); 
} catch (IOException e) { 
throw new InputMismatchException(); 
} 
if (numChars <= 0) { 
return -1; 
} 
} 

return buf[curChar++]; 
} 

public int peek() { 
if (numChars == -1) { 
return -1; 
} 
if (curChar >= numChars) { 
curChar = 0; 
try { 
numChars = stream.read(buf); 
} catch (IOException e) { 
return -1; 
} 
if (numChars <= 0) { 
return -1; 
} 
} 
return buf[curChar]; 
} 

public int nextInt() { 
int c = read(); 
while (isSpaceChar(c)) 
c = read(); 
int sgn = 1; 
if (c == '-') { 
sgn = -1; 
c = read(); 
} 
int res = 0; 
do { 
if (c == ',') { 
c = read(); 
} 
if (c < '0' || c > '9') { 
throw new InputMismatchException(); 
} 
res *= 10; 
res += c - '0'; 
c = read(); 
} while (!isSpaceChar(c)); 
return res * sgn; 
} 

public long nextLong() { 
int c = read(); 
while (isSpaceChar(c)) 
c = read(); 
int sgn = 1; 
if (c == '-') { 
sgn = -1; 
c = read(); 
} 
long res = 0; 
do { 
if (c < '0' || c > '9') { 
throw new InputMismatchException(); 
} 
res *= 10; 
res += c - '0'; 
c = read(); 
} while (!isSpaceChar(c)); 
return res * sgn; 
} 

public String nextString() { 
int c = read(); 
while (isSpaceChar(c)) 
c = read(); 
StringBuilder res = new StringBuilder(); 
do { 
res.appendCodePoint(c); 
c = read(); 
} while (!isSpaceChar(c)); 
return res.toString(); 
} 

public boolean isSpaceChar(int c) { 
if (filter != null) { 
return filter.isSpaceChar(c); 
} 
return isWhitespace(c); 
} 

public static boolean isWhitespace(int c) { 
return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1; 
} 

private String readLine0() { 
StringBuilder buf = new StringBuilder(); 
int c = read(); 
while (c != '\n' && c != -1) { 
if (c != '\r') { 
buf.appendCodePoint(c); 
} 
c = read(); 
} 
return buf.toString(); 
} 

public String nextLine() { 
String s = readLine0(); 
while (s.trim().length() == 0) 
s = readLine0(); 
return s; 
} 

public String nextLine(boolean ignoreEmptyLines) { 
if (ignoreEmptyLines) { 
return nextLine(); 
} else { 
return readLine0(); 
} 
} 

public BigInteger nextBigInteger() { 
try { 
return new BigInteger(nextString()); 
} catch (NumberFormatException e) { 
throw new InputMismatchException(); 
} 
} 

public char nextCharacter() { 
int c = read(); 
while (isSpaceChar(c)) 
c = read(); 
return (char) c; 
} 

public double nextDouble() { 
int c = read(); 
while (isSpaceChar(c)) 
c = read(); 
int sgn = 1; 
if (c == '-') { 
sgn = -1; 
c = read(); 
} 
double res = 0; 
while (!isSpaceChar(c) && c != '.') { 
if (c == 'e' || c == 'E') { 
return res * Math.pow(10, nextInt()); 
} 
if (c < '0' || c > '9') { 
throw new InputMismatchException(); 
} 
res *= 10; 
res += c - '0'; 
c = read(); 
} 
if (c == '.') { 
c = read(); 
double m = 1; 
while (!isSpaceChar(c)) { 
if (c == 'e' || c == 'E') { 
return res * Math.pow(10, nextInt()); 
} 
if (c < '0' || c > '9') { 
throw new InputMismatchException(); 
} 
m /= 10; 
res += (c - '0') * m; 
c = read(); 
} 
} 
return res * sgn; 
} 

public boolean isExhausted() { 
int value; 
while (isSpaceChar(value = peek()) && value != -1) 
read(); 
return value == -1; 
} 

public String next() { 
return nextString(); 
} 

public SpaceCharFilter getFilter() { 
return filter; 
} 

public void setFilter(SpaceCharFilter filter) { 
this.filter = filter; 
} 

public interface SpaceCharFilter { 
public boolean isSpaceChar(int ch); 
} 
} 
}